【发布时间】:2016-07-12 11:03:18
【问题描述】:
我正在尝试使用 Promise 连续运行多个异步任务。每个任务都应该在前一个任务完成后立即运行。这是我尝试过的简化示例:
var order = [];
var tasks = [
new Promise(resolve => {
order.push(1);
setTimeout(() => {
order.push(2)
resolve();
}, 100);
}),
new Promise(resolve => {
order.push(3);
setTimeout(() => {
order.push(4)
resolve();
}, 100);
}),
new Promise(resolve => {
order.push(5);
resolve();
})
];
tasks.reduce((cur, next) => cur.then(next), Promise.resolve()).then(() => {
console.log(order); // [ 1, 3, 5 ]
});
setTimeout(() => console.log(order), 200); // [ 1, 3, 5, 2, 4 ]
我希望order 在回调函数中等于[ 1, 2, 3, 4, 5 ]。但是我得到了那些奇怪的结果([ 1, 3, 5 ] 在then 回调和[ 1, 3, 5, 2, 4 ] 在延迟函数中)。我错过了什么?
【问题讨论】:
-
我在 Angular 中使用 $q.serial 从这里做类似的事情:codeducky.org/q-serial 您可以摆脱特定于角度代码的东西并对其进行调整以满足您的需求。您还可以查看
async库中的waterfall方法:github.com/caolan/async -
reduce 函数在继续处理数组中的下一个条目之前不会等待前一个 promise 解决,因此您会在循环中立即触发所有三个推送。
setTimeout会延迟 resolve(),但不会延迟 promise 内的操作 -
你写
new Promise(function() {...的那一刻,承诺回调正在运行(你正在使用箭头函数,但相同)。如果你想串行而不是并行运行它们,你不能像那样在数组中创建承诺,你需要想出一些不同的东西
标签: javascript promise ecmascript-6 es6-promise