for 循环中的 Promise 链

Promise chain inside for loop

for (var i in listofInstances) {
        cleanupInstance(listofInstances[ i ])
        .then(function () {
            console.log("Done" + listofInstances[ i ])
        });
}

cleanupInstance 也是一个承诺链。然而,目前我的 for 循环在整个承诺链完成之前进入下一次迭代。有没有办法也承诺循环?我正在使用 Bluebird 库 (nodejs) 来实现承诺。

您可以使用 .each:

var Promise = require('bluebird');
...
Promise.each(listofInstances, function(instance) {
  return cleanupInstance(instance).then(function() {
    console.log('Done', instance);
  });
}).then(function() {
  console.log('Done with all instances');
});

为什么不使用 Promise.eachPromise.all ?它会更容易理解和灵活。

请检查下面的示例。

var Promise = require('bluebird');
var someArray = ['foo', 'bar', 'baz', 'qux'];

Promise.all(someArray.map(function(singleArrayElement){
  //do something and return
  return doSomethingWithElement(singleArrayElement);
})).then(function(results){
  //do something with results
});

Promise.each(someArray, function(singleArrayElement){
  //do something and return
  return doSomethingWithElement(singleArrayElement);
}).then(function(results){
  //do something with results
});

或者你可能有一个循环。如果你有数组数组,这只是一个例子。

var Promise = require('bluebird');
var arrayOfArrays = [['foo', 'bar', 'baz', 'qux'],['foo', 'bar', 'baz', 'qux']];

function firstLoopPromise(singleArray){
  return Promise.all(singleArray.map(function(signleArrayElement){
    //do something and return
    return doSomethingWithElement(signleArrayElement);
  }));
}


Promise.all(arrayOfArrays.map(function(singleArray){
  //do something and return
  return firstLoopPromise(singleArray);
})).then(function(results){
  //do something with results
});

请解释一下当 all 循环中有多个 promise 链时的代码。
例如:

Promise.all(someArray.map(function(singleArrayElement){
    //do something and return
    return doSomethingWithElement(singleArrayElement)
    .then(function(result){
    return doSomethingWithElement(result)
})
.then(function(result){
    return doSomethingWithElement(result)
})
})).then(function(results){
    //do something with results
});