redux - 运行并行传奇效果而不取消其中任何一个
问题描述
我想用 redux-saga 运行并行效果,如果发生错误而不抛出。
使用all
redux-saga 的效果,如果:
在所有效果完成之前,其中一个效果被拒绝:在生成器中抛出拒绝错误。
基本上,我想等待所有效果完成触发动作。我想做这样的事情,但用all
别的东西代替:
export function* getSaga() {
yield put(request());
try {
yield all([fetchItems1, fetchItems2, fetchItems3]);
// Wait for all to resolve or get rejected, then dispatch succeed.
yield put(actions.succeeded());
} catch (e) {
// This should never happen.
}
}
我尝试使用fork
,但如果一项失败,它会取消所有其他任务。而且我尝试使用spawn
,但它不会等待任务完成来 dispatch succeeded
。
使用常规 JS,有一种称为反射的模式,我想将其应用于 saga。
我们怎样才能做到这一点?
谢谢
解决方案
按照链接的 stackoverflow 问题的答案,您可以轻松地创建一个reflect
saga 并以相同的方式使用它:
function* reflect(saga) {
try {
return { v: yield call(saga), status: 'fulfilled' }
} catch (err) {
return { e: err, status: 'rejected' }
}
}
...
yield all([fetchItems1, fetchItems2, fetchItems3].map(reflect));
推荐阅读
- javascript - resolve 在 Promise 中真正做了什么?
- go - golang中的正则表达式匹配
- r - 在 Shiny 应用服务器中找不到用户选择输入
- python - 如何计算没有任何特殊字符的字符数?
- angular - 手风琴里面的手风琴和 ngFor
- jupyter-notebook - 无法使用 torchaudio 更改 jupyter notebook 中的 mp3 文件采样率
- python - 来自 POST 请求的 URL 中的 Django 参数
- model - 获取 GregorianCalendar 日期时出错
- python - 没有任何 Xpath 的 send_keys
- julia - MethodError: 没有方法匹配 isless(::Matrix{Float64}, ::Matrix{Float64})