为了理解ES6 promise的执行顺序,我注意到链接处理程序的执行顺序受前一个处理程序是返回值还是promise的影响.
例
let a = Promise.resolve();
a.then(v => Promise.resolve("A")).then(v => console.log(v));
a.then(v => "B").then(v => console.log(v));Run Code Online (Sandbox Code Playgroud)
直接在Chrome(v 61)控制台中运行时的输出:
B
A.
但是,当点击Run code snippet按钮时,我会收到订单A B.
是否在ES6中为上述示例定义了执行顺序,还是由实现决定?
如果定义了,那么正确的输出应该是什么?
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let p = sleep(50);
p.then(() => console.log('a')).then(() => console.log('c'));
p.then(() => console.log('b')).then(() => console.log('d'));Run Code Online (Sandbox Code Playgroud)
这是否保证按顺序打印"a,b,c,d"?
据我所知,"a"必须在"c"之前触发,"b"必须在"d"之前触发,但除此之外,JS解释器是否可以决定以不同的顺序执行余数?
我想确认当then同一个promise上有多个回调时,是否保证传递给的回调的调用顺序.
这是我观察到的.例:
function wait(delayMs) {
return new Promise(resolve => setTimeout(resolve, delayMs))
}
let prom = wait(500)
for (let i = 0; i < 20; ++i)
prom.then(() => { console.log(i) }) // OK: Display 0 to 19 in the right order
Run Code Online (Sandbox Code Playgroud)
我观察到回调顺序是受到尊重的,但我没有找到关于这个主题的任何文档.回调订单是否有保证?
编辑:这不是一个如何链接承诺的问题.在这里,我只有一个承诺有几个回调.回调then以确定的顺序传递.我想知道是否也确定了回调执行的顺序.