Node JS Bluebird嵌套循环承诺

时间:2016-04-26 09:38:33

标签: node.js promise bluebird

我在NodeJS中使用蓝鸟。我想做一个嵌套循环。像这样:

for (var i = 0; i < array.length; i++) {
   for (var j = 0; j < array.length; j++) {
        if (i !== j) {
            // do some stuff
        }
   }
}

我如何用蓝鸟宣传这个循环?

我在这里看到一些类似的问题 Science Fiction & Fantasy Stack Exchange 或者在这里 How to use promise bluebird in nested for loop?

但这并不能澄清我的怀疑。除了代码之外,我想要一些解释,因为我真的不明白我在做什么。

提前致谢!

1 个答案:

答案 0 :(得分:4)

当然,你正在使用Node,你有协同程序,使用它们:

function myWork = Promise.coroutine(function*() {
   for (var i = 0; i < array.length; i++) {
     for (var j = 0; j < array.length; j++) {
       if (i !== j) {
           // do some stuff
           // this can be async calls, for example
           yield thisReturnsAPromise(i, j); // call some async function
       }
     }
  }
});

要处理错误,您可以使用常规try/catch。要调用它,您执行doWork()并返回一个可以thencatch的承诺。

问题是,在ES2015和生成器之前,您有issues with returning async values并使用常规流控制结构。在旧的Node中,您必须在嵌套在Promise.each中的数组上使用Promise.each并返回内部承诺:

Promise.each(array, function(i) {
    return Promise.each(array, function(j) {
        return thisReturnAPromise(i, j); 
    });
});

协同程序简化了此操作,并yield将控制权交给了承诺泵。