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

时间:2017-01-29 23:00:52

标签: 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'));




这是否可以打印" a,b,c,d"按顺序?

据我所知," a"必须先解雇" c"和" b"必须在" d"之前解雇,但除此之外,JS解释器是否可以决定以不同的顺序执行余数?

2 个答案:

答案 0 :(得分:1)

使用setTimeout对事物进行排队的方式就是 - 队列。如果两个回调排队使用相同的延迟',则首先排队的回叫将首先触发。

编辑:我最初没有理解OP的用意。

'分支'承诺是这里实际发生的事情。意义 - 然后能够'在第一组the-ables中引用(对于a& b)将在同一时间触发两个提供的回调'因为它们都引用了相同的承诺 - 但是 - 棘手的是它们按照它们使用解析承诺对象的.then(...)排队的顺序执行。

然后,以下/后续回调按其各自的顺序排列(c& d)。

直接回答这个问题:不可以。当时的异步行为的性质可以是任何东西。但是,OP的随后提供的功能基本上是同步的,从而产生了直观但完全误导性的记录顺序。

答案 1 :(得分:1)

  

据我所知,“a”必须在“c”之前开火,“b”必须在“d”之前开火

是的,那对certan来说太多了。

  除此之外,JS解释器能否决定以不同的顺序执行余数?

取决于你问谁,但没有更多的保证可以使输出更具可预测性:

  • Promise/A+ specification还要求“所有相应的回调必须按其原始调用顺序执行。”所以在您的示例中,这意味着“a”必须先触发“b”,因为回调首先被链接到p
  • ECMAScript specification为承诺回调定义了一个作业队列,确定了顺序(imo不必要)。它符合Promises / A +,因为“a”和“b”回调按照承诺履行时设置的顺序排队。这也意味着在“a”返回并履行承诺之后,它将调度“c”,并且在“b”返回并履行承诺之后,它将调度“d”,因此它们的顺序也被确定(对于同步回调) )。

一般情况下,如果您需要某个订单,请不要依赖任何调度算法,然后将其显式化。