我试图按顺序执行一系列的承诺,只有在前一个解决之后才进入下一个承诺。来自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,这反映了所有的功能都是实时调用的。此外,结果确实以他们被调用的顺序显示结果,尽管这在此时是无关紧要的。
我在这里误解了什么吗?
你的测试调用是在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);
});