承诺循环 - 基本
问题描述:
什么是通过这个承诺链循环的最佳方式?代码工作正常,没有'for循环',最后一步是在MongoDB中保存JSON。第一次迭代后,NodeJS shell挂起。承诺循环 - 基本
for(i=0; i < 2; i++){
forLoop(countOfFlights,jsonRead).then(function(fromResolve){
return filter(fromResolve)
}).then(function(fromResolve){
return sort(fromResolve)
}).then(function(fromResolve){
saveMongoDB(fromResolve)
})}
我查了一些关于无极&循环线程,但例子对我来说太复杂了。也许只有一条魔术线可以解决它。我敢肯定,为什么它会挂起会更有益。
亲切的问候,
答
-comment continued- 你可以只遍历同步的,但永远是比只使用承诺慢。只要文件插入与彼此不相关,可以同时插入所有文件而无需等待prev插入成功是一场胜利,所以我个人坚持承诺。
我会瞄准像这样的结构:
这样的想法是首先使用循环创建了一堆承诺,那么我们运行“同时”所有的承诺,然后处理所有结果。
如果出于某种原因,您确实想单独处理每个文件,请将您的代码放入函数中,并直接循环该函数而不是代码。但这也意味着你需要某种计数器或再次promise.all()时,所有的文件插入完成检查:
var insertFile = function insertFile(count, json) {
return forLoop(
count,
json
).then(function(fromResolve){
return filter(fromResolve);
}).then(function(fromResolve){
return sort(fromResolve);
}).then(function(fromResolve){
return saveMongoDB(fromResolve);
}).then(function(inserted) {
// do stuff seperately for an insert
return inserted;
}).catch(function(error) {
throw error;
});
});
},
i,
requests = [];
for (i = 0; i < 2; i += 1) {
requests.push(insertFile(countOfFlights, jsonReads));
}
Promise.all(
requests
).then(function(responses) {
// all files are inserted
}).catch(function(error) {
// something went wrong
});
你也许可以合并过滤器和回调整理成一个.reduce()
,但这只是一个方面的评论,因为我不知道.filter()和.sort()是如何编码的。
尝试用Promise.all()重写,但可能还包括重写不在此处显示的forloop()方法,也可能会更改filter(),sort()函数,具体取决于它们的实现。但经验法则,承诺和for循环不匹配。你有没有为循环返回承诺,你包装在promise.all()中,然后将所有结果作为一个数组处理,而不是单独处理每个结果并循环整个承诺链。 – Shilly
明白了。感谢舍利!在我尝试你所推荐的内容之前 - 你能否建议与Promise不同的解决方案?我需要迭代来自多个文件的数组并将它们发布到MongoDB。先谢谢你 ! – user7861743