蓝鸟地图系列

问题描述 投票:7回答:1

我试图按顺序执行一系列的承诺,只有在前一个解决之后才进入下一个承诺。来自Bluebird文档:

直到前一个项目才会调用迭代器,并且迭代器为该项目返回的promise将被满足。 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,这反映了所有的功能都是实时调用的。此外,结果确实以他们被调用的顺序显示结果,尽管这在此时是无关紧要的。

我在这里误解了什么吗?

node.js promise bluebird
1个回答
11
投票

你的测试调用是在Promise.mapSeries有机会运行之前。 mapSeries通常也在promise实例上运行。也许下面的例子有助于理解?注意这次测试(时间)如何返回一个函数。

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);
});
© www.soinside.com 2019 - 2024. All rights reserved.