javascript - 使用 Q promise 库不按顺序执行 Promise 链

标签 javascript promise deferred q

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

这是一个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 个批处理 promise 操作。这意味着此示例的输出将如下所示:

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() 但它在第一个链后停止执行。我错过了一些明显的东西吗?

感谢您的任何建议。

干杯

最佳答案

Am I missing something obvious?

是的。对于 then 要用另一个 promise 解决这个 promise,您必须返回另一个 promise 给它。您的函数只是启动了另一个 asyncChain,但从回调中返回了 undefined,这立即解决了 promise。

asyncChain(10, 'FIRST CHAIN').then(function () {
  return asyncChain(10, 'SECOND CHAIN');
}).then(function(){
  return asyncChain(10, 'THIRD CHAIN');
});

关于javascript - 使用 Q promise 库不按顺序执行 Promise 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18933903/

相关文章:

Javascript 数组初始化行为

javascript - 使用照片编辑器 SDK 从 URL 编辑照片

javascript - ajax 和哈希 url

javascript - 从回调中返回数据

javascript - Promise 如何被解决和待处理?

python - Twisted:如何从失败中获取错误参数?

javascript - 如何在javascript中将分数转换为 float ?

javascript - 从异步函数返回 observable

python - 如何在 Twisted 中触发延迟?

javascript - 需要AngularJS/Javascript三元运算符代码解释