这个Promise链是否保证按此顺序执行?

mpe*_*pen 6 javascript promise

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解释器是否可以决定以不同的顺序执行余数?

The*_*ski 1

事物排队的方式setTimeout就是队列。如果两个回调以相同的“延迟”排队,则先排队的回调将首先触发。

编辑:我最初没能理解OP的意图。

“分支”承诺是这里实际发生的事情。含义 - 第一组 then-able(对于 a 和 b)中引用的“then-able”将“同时”触发两个提供的回调,因为它们都引用相同的 Promise - 然而 - 棘手的一点是它们按照使用.then(...)解析 Promise 对象排队的顺序执行。

然后后续/后续回调按各自的顺序排队(c 和 d)。

直接回答这个问题:不。then-able 中的异步操作的性质可以是任何东西。然而,OP 的 then-ables 中提供的功能本质上是同步的,从而产生直观但完全误导的记录顺序。