按顺序执行以下语句:
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从this answer开始的每2.2.6.1。)
A1
/ A2
是否会在B
之前被触发(因为A在B之前完成)?
答案 0 :(得分:1)
在B之前是否总是触发A1 / A2(因为A在B之前完成)?
不,不一定。回调的顺序仅根据承诺定义。甚至可能发生B在A1和A2之间被触发。
这无论如何都没有意义,因为通常你不会知道在promiseA
之前完成promiseB
。当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);
});