【问题标题】:Promise chains are not executed sequentially using Q promise libraryPromise 链不是使用 Q Promise 库按顺序执行的
【发布时间】:2013-09-26 20:28:33
【问题描述】:

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

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

感谢您的建议。

干杯

【问题讨论】:

  • 在批次中,“异步”仍然是指“顺序”,而不是“并行”?
  • 我指的是后者。

标签: javascript promise deferred q


【解决方案1】:

我是否遗漏了一些明显的东西?

是的。要让then 用另一个承诺解决承诺,您必须返回另一个承诺。你的函数只是启动另一个asyncChain,但会从回调中返回undefined,它会立即解决promise。

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

【讨论】:

  • 感谢您指出这一点,我想我只是花了太多时间盯着相同的代码 :) 我还发现使用 'thenResolve' 方法使语法更具可读性和匿名函数不必定义。
  • 但是thenResolve 在评估asyncChain(…) 之前不会等待第一个promise,让它再次并行?
  • thenResolve() 只是 function(){} 的糖。查看 源代码 - 第 846 行。
  • 是的,但是在评估value 时有很大的不同……在将结果传递给thenResolve 之前调用asyncChain 时,所有调用都将并行执行。在传递给then的匿名函数中调用时,会依次执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2016-08-07
  • 2020-03-13
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多