JavaScript:在第一个等待的诺言之前,异步函数中的代码会同步运行吗?

时间:2019-04-03 19:12:16

标签: javascript asynchronous es6-promise

给出以下内容:

FirebaseFirestore db = FirebaseFirestore.getInstance();
FirebaseAuth auth = FirebaseAuth.getInstance();

String userID = auth.getCurrentUser().getUid();

String doc = db.collection("courses").document(String.valueOf(position)).getPath();

我是否在所有引擎和编译过程中都保证异步函数调用后function defer(delay) { return new Promise((resolve) => setTimeout(resolve, delay)); } let a; (async () => { a = 1; await defer(1000); a = 2; })(); console.log(a); // 1 的值是a且未定义?换句话说,第一个await语句之前的代码是否同步执行?

1 个答案:

答案 0 :(得分:2)

  

换句话说,第一个await语句之前的代码是否同步执行?

是的。

在规范25.7.5.1中进行了指定:

  

25.7.5.1 AsyncFunctionStart(promiseCapability,asyncFunctionBody)

     

[用于在某些时候恢复执行的逻辑]

     
      
  1. 将asyncContext推送到执行上下文堆栈;现在asyncContext是正在运行的执行上下文。

  2.   
  3. 恢复对asyncContext的暂停评估。令result为恢复后的返回值   计算。

  4.   
  5. 声明:当我们返回此处时,asyncContext已从执行上下文堆栈中删除,并且   runningContext是当前正在运行的执行上下文。

  6.   
  7. 声明:结果是正常完成,值为undefined。完成值的可能来源是   等待,或者,如果异步功能什么也没有等待,请执行上面的步骤3.g。

  8.   

此操作在调用异步函数时运行,并且可以看到它直接执行 asyncContext ,而无需等待任何操作。但是,如果引擎到达await,则会主动中止执行:

  

6.2.3.1等待

     

[设置逻辑以继续运行]

     
      
  1. 从执行上下文堆栈中删除asyncContext并还原位于顶部的执行上下文   执行上下文堆栈作为运行中的执行上下文。
  2.