JavaScript ES6 - 承诺解决和事件之间可能的竞争条件?

时间:2017-07-25 09:24:21

标签: javascript race-condition es6-promise

是否可以在promise promise和promise await返回之间执行用户代码?

function a () {
  return new Promise(resolve => {
    setTimeout(() => {
      // Between here...
      resolve()
    }, 1000))
  }
}

async function b () {
  await a()
  // ...and here ?
}

规范是否强制立即调用Promise回调?我想知道两点之间的虚拟机是否可以处理事件,可能会造成副作用。

2 个答案:

答案 0 :(得分:4)

不,它不会立即强制执行。 The spec在解决承诺时会经历一系列步骤,其中之一是:

  
      
  1. 执行EnqueueJob(“PromiseJobs”,PromiseResolveThenableJob,«promise,resolution,thenAction»)
  2.   

请注意,根据承诺的状态,可以采用不同的路线。但是,他们都是end at EnqueueJob,其中说:

  
      
  1. 在queueName命名的作业队列后面添加待处理。
  2.   

因此,任何进一步的执行都会延迟到作业队列的末尾。

答案 1 :(得分:1)

承诺回调立即调用。您的函数b()转换为

function b () {
  return a().then(() => {
    // Do something
  });
}

其中then的函数在某个时间点被事件循环执行 后,来自a的承诺得到解决。永远不会同步调用它,因为规范保证Promise continuation始终使用空调用堆栈运行(这意味着在eventloop的新迭代中)。因此,一些其他代码(例如来自另一个promise resolval)可以在解决promise的时间和延续运行的时间之间运行。