蓝鸟地图系列
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);
});
我试图按顺序执行一系列承诺,只有在前一个承诺解决后才转到下一个承诺。来自蓝鸟文档:
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);
});