【问题标题】:In what order are Promise callbacks triggered?Promise 回调按什么顺序触发?
【发布时间】:2015-01-13 13:25:09
【问题描述】:

假设以下语句已按此顺序执行:

promiseA.then(function() { console.log('A1'); });
promiseB.then(function() { console.log('B'); });
promiseA.then(function() { console.log('A2'); });

现在promiseA 已满随后是 promiseB

规范中有定义(this是最新的规范吗?)这三个回调的触发顺序是什么?

A1 总是会在A2 之前触发吗? (更新:是的,根据 this spec 的 2.2.6.1,正如 this answer 所指出的那样。)

A1/A2 是否总是在 B 之前触发(因为 A 先于 B 完成)?

【问题讨论】:

  • 我相信A1A2B 是有保证的,但我不知道在哪里指定。
  • @Alnitak:是的,我也是,但我想在依赖它之前知道
  • @JanMarthedalRasmussen: I would like to know before relying on it,我建议不要依赖它。如果有一个必须执行的固有顺序,那么它们可能应该与.then 链接在一起,而不是分开。
  • 每个 promise 按照它们注册的顺序执行回调(是的,它在规范中)。不指定不同promise的回调执行顺序,取决于你在何时何地解决它们
  • @Alnitak:指定异步调用所有回调。他们都是。没有例外。

标签: javascript promise


【解决方案1】:

A1/A2 是否总是在 B 之前触发(因为 A 在 B 之前完成)?

不,不一定。回调的顺序仅根据 Promise 定义。甚至有可能在 A1 和 A2 之间触发 B。

这实际上没有任何意义,因为通常您不知道 promiseApromiseB 之前完成。只有当 promiseB 派生自 promiseA 时,您才能依赖它 - 然后保证在 A 上导致 B 的“派生回调”之后调用 B 的回调。

所以,如果你需要保证只在 A1 和 A2 之后发出回调(因为它依赖于它们的结果),你应该这样做

var promiseA1 = promiseA.then(function(a) { console.log('A1'); return 'A1'; });
var promiseA2 = promiseA.then(function(a) { console.log('A2'); return 'A2'; });
Promise.all([promiseB, promiseA1, promiseA2]).spread(function(b, a1, a2) {
    console.log('B after ', a1, a2);
});

【讨论】:

  • 这是正确的答案 - 值得强调的是,除非它们之间存在显式依赖关系(到那时或通常),否则您不应该一个接一个地依赖承诺的顺序。
  • 请注意,spread 是第三方承诺库(Bluebird、Q 等)的扩展,并且不存在于本机承诺中。
  • @Qantas94Heavy:当然,在 ES6 中你会使用解构:.then(function([b, a1, a2]) {…
  • @Bergi:是的,以防万一有人感到困惑。我知道你知道:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2012-08-09
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多