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

Naz*_*gol 1 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;
}
Run Code Online (Sandbox Code Playgroud)

基本上这些是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
Run Code Online (Sandbox Code Playgroud)

我尝试使用all()方法而不是then()在第一个链后停止执行.我错过了一些明显的东西吗

谢谢你的建议.

干杯

Ber*_*rgi 6

我错过了一些明显的东西吗

是.为了then用另一个承诺来解决承诺,你必须将其他承诺归还给它.你的函数只是启动另一个函数asyncChain,但是undefined从回调中返回,它立即解析了promise.

asyncChain(10, 'FIRST CHAIN').then(function () {
  return asyncChain(10, 'SECOND CHAIN');
}).then(function(){
  return asyncChain(10, 'THIRD CHAIN');
});
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是当评估`value`时有一个巨大的差异...当结果被传递到[`thenResolve`]之前调用`asyncChain`时(https://github.com/kriskowal/q/blob/master/q. js#l846),所有调用都将并行执行.当在传递给`then`的匿名函数中调用它时,它们将按顺序执行. (2认同)