承诺循环 - 基本

问题描述:

什么是通过这个承诺链循环的最佳方式?代码工作正常,没有'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) 
    })} 

我查了一些关于无极&循环线程,但例子对我来说太复杂了。也许只有一条魔术线可以解决它。我敢肯定,为什么它会挂起会更有益。

亲切的问候,

+0

尝试用Promise.all()重写,但可能还包括重写不在此处显示的forloop()方法,也可能会更改filter(),sort()函数,具体取决于它们的实现。但经验法则,承诺和for循环不匹配。你有没有为循环返回承诺,你包装在promise.all()中,然后将所有结果作为一个数组处理,而不是单独处理每个结果并循环整个承诺链。 – Shilly

+0

明白了。感谢舍利!在我尝试你所推荐的内容之前 - 你能否建议与Promise不同的解决方案?我需要迭代来自多个文件的数组并将它们发布到MongoDB。先谢谢你 ! – user7861743

-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()是如何编码的。