yBr*_*sky 7 node.js promise bluebird
我试图按顺序执行一系列的承诺,只有在前一个解决之后才进入下一个承诺.来自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);
});
Run Code Online (Sandbox Code Playgroud)
我期望的是测试函数里面的console.log按顺序显示:2000,1000,500,3000.我希望这是因为正如文档所述,每个项目仅在前一个项目解决之后才会发生.相反,我得到500,1000,2000,3000,这反映了所有功能都是实时调用的.此外,结果确实以他们被调用的顺序显示结果,尽管这在此时是无关紧要的.
我在这里误解了什么吗?
Ben*_*tan 11
你的测试调用是在Promise.mapSeries有机会运行之前.此外mapSeries通常是在一个承诺实例上运行.也许下面的例子有助于理解?注意这次测试(时间)如何返回一个函数.
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);
});
Run Code Online (Sandbox Code Playgroud)