我正在代码中执行多个批处理异步操作。尽管批处理中的操作应异步执行,但批处理应一个接一个地同步执行。
这是我创建的jsfiddle。查看控制台,因为所有输出都在那里。为方便起见,这是代码:
asyncChain(10, 'FIRST CHAIN')
.then(function () {
asyncChain(10, 'SECOND CHAIN');
})
.then(function(){
asyncChain(10, 'THIRD CHAIN');
});
function asyncChain(n, msg) {
var promiseChain = Q.fcall(function () {
10;
});
console.log('starting:' + msg);
for (var i = 0; i < n; i++) {
promiseChain = promiseChain.then(asyncOperation(i, msg));
}
console.log('returning' + msg);
return promiseChain;
}
function asyncOperation(i, msg) {
var d = Q.defer();
setTimeout(function () {
console.log('resolving for #' + i + msg);
d.resolve(i);
}, 300 + Math.random()*1000);
return d.promise;
}
基本上这些是我期望一个接一个完成的 3 个批量承诺操作。这意味着此示例的输出如下所示:
starting FIRST CHAIN
returning FIRST CHAIN
resolving 1..10 FIRST CHAIN
starting SECOND CHAIN
returning SECOND CHAIN
resolving 1..10 SECOND CHAIN
and so on
我尝试使用all()
方法而不是then()
但它在第一次链后停止执行。我错过了一些明显的东西吗?
感谢您的任何建议。
干杯
我错过了一些明显的东西吗?
是的。为了让then
用另一个承诺来解决承诺,你必须将另一个承诺归还给它。你的函数只是启动另一个asyncChain
,但从回调返回undefined
,这会立即解决承诺。
asyncChain(10, 'FIRST CHAIN').then(function () {
return asyncChain(10, 'SECOND CHAIN');
}).then(function(){
return asyncChain(10, 'THIRD CHAIN');
});