2016-04-26 91 views
2

我在NodeJS中使用藍鳥。我想做一個嵌套的循環。這樣的事情:節點JS藍鳥嵌套循環承諾

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

我該如何讓這個循環與藍鳥?

我在這裏看到了一些類似的問題 How to use promise bluebird in nested for loop? 或這裏 in node.js, how to use bluebird promise with a for-loop

但是,這並不清楚我的疑問。除了代碼之外,我還想要一些解釋,因爲我不明白我在做什麼。

在此先感謝!

回答

3

當然,你使用的節點,你有協同程序,使用它們:

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回控制的承諾泵需要的是關懷。