如何使用redux-saga等待所有动态数量的货叉完成?

时间:2017-10-04 15:58:44

标签: javascript multithreading redux redux-saga

我尝试使用redux saga查询多个其他端点,以获取与每个已发现网络关联的人类可读名称,以填充带有可选网络的下拉列表。

我在做这件事时遇到了麻烦,我的分叉无效。我一直收到错误消息:

TypeError: __webpack_require__.i(..) is not a function(...)

每个使用all()的示例我发现在线使用呼叫并提前知道每个请求。但是,从API判断我尝试过这样的事情:

const pendingQueries = [];
for(networkId in discoveredNetworks) {
  pendingQueries.push(fork(getApplicationName, networkId);
}

const queryResults = yield all(pendingQueries);

这失败了。从那以后,我尝试了许多其他的排列。通过测试,我能够验证我能做到这一点:

const results = [];

for(networkId in discoveredNetworks) {
   results.push(yield fork(getApplicationName, networkId));
 }

并且如果有足够长的延迟,该方法将运行并完成,尽管这种方法显然不会在我按照我的意愿使用结果之前完成分叉方法。似乎仍然证实问题在于我对所有问题的使用。

我的所有命令有什么问题?

2 个答案:

答案 0 :(得分:1)

为什么不在承诺中包装每个请求并像这样调用它们:

var promises = []
for(networkId in discoveredNetworks) {
   promises.push(new Promise((res, rej) => {
        // code from getApplicationName goes here 
        // call res(result) on success and rej(error) on failure 
   }));
}
const results = yield call(Promise.all(promises))

答案 1 :(得分:0)

我通过放弃all()方法来实现这一点,我从来没有按照宣传的方式工作,但这不是真正适合这项工作的方法。

对于forks,我应该使用join()代替。所以有类似的东西:

^ord[ie]