javascript - Promise 回调的触发顺序是什么?

标签 javascript promise

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

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 之前完成)?

最佳答案

Will A1/A2 always be triggered before B (since A was fulfilled before B)?

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

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

因此,如果您需要保证仅在 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);
});

关于javascript - Promise 回调的触发顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923253/

相关文章:

javascript - 为什么这个 readline 异步迭代器不能正常工作?

javascript - React/Javascript,无法访问对象中的字段

javascript - 在成功的 AJAX 调用后修改传递给 jQuery done() 回调的参数

javascript - TextArea 返回错误值

javascript - 具有字符重复的字符串

javascript - Parse.com 在云代码中创建 strip 卡 token (main.js)

javascript - 如何(优雅地)用 Q 中断 Promises 链的执行

javascript - 如何监听 "ref"对象变化?

javascript - php脚本回显中的双引号

javascript - 如何在javascript中使用promise获取多个图像文件信息