蓝鸟地图系列

Bluebird mapSeries

我试图按顺序执行一系列承诺,只有在前一个承诺解决后才转到下一个承诺。来自蓝鸟文档:

The iterator won't be called for an item until its previous item, and the promise returned by the iterator for that item are fulfilled. http://bluebirdjs.com/docs/api/promise.mapseries.html

var Promise = require('bluebird');


function test(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            console.log(time);
            resolve(time);
        }, time);
    });
}

Promise.mapSeries([test(2000), test(1000), test(500), test(3000)], function(a) {
    return a;
}).then(function(results) {
    console.log(results);
});

我期望的是测试函数中的 console.log 按顺序显示:2000、1000、500、3000。我希望这是因为正如文档所述,每个项目只有在前一个解决后才会出现。相反,我得到了 500、1000、2000、3000,这反映了所有函数都是瞬时调用的。此外,results 确实按照它们被调用的顺序显示结果,尽管此时这无关紧要。

我是不是误会了什么?

你的测试电话是在 Promise.mapSeries 有机会 运行 之前进行的。此外 mapSeries 通常是 运行 在承诺实例上。也许下面的例子有助于理解?注意这次 test(time) 如何 returns 一个函数。

function test(time) {
    return function(value) {
      return new Promise(function(resolve, reject) {
          setTimeout(function() {
              console.log('time', time);
              resolve(time);
          }, time);
      });
    };
}

Promise.resolve([test(2000), test(400), test(1000), test(1), test(5000)])
       .mapSeries(function(asyncMethodPassed) {
                    return asyncMethodPassed();
}).then(function(results) {
    console.log('result', results);
});