承诺链不使用 Q 承诺库按顺序执行

Promise chains are not executed sequentially using Q promise library

本文关键字:承诺 顺序 执行      更新时间:2023-09-26

我正在代码中执行多个批处理异步操作。尽管批处理中的操作应异步执行,但批处理应一个接一个地同步执行。

这是我创建的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');
});