【问题标题】:Node JS Bluebird nested loops promiseNode JS Bluebird 嵌套循环承诺
【发布时间】:2016-08-20 01:12:59
【问题描述】:

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

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

我怎样才能用 bluebird 来保证这个循环?

我在这里看到了一些类似的问题 How to use promise bluebird in nested for loop? 或在这里 in node.js, how to use bluebird promise with a for-loop

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

提前致谢!

【问题讨论】:

    标签: node.js promise bluebird


    【解决方案1】:

    当然,你使用的是 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 并将它们与常规流控制结构一起使用。在旧节点中,您必须在嵌套在 Promise.each 返回的数组上使用 Promise.each 并返回其中的内部承诺:

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

    协程简化了这一点,yield 将控制权返回给负责处理该问题的承诺泵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 2017-01-16
      相关资源
      最近更新 更多