给出以下内容:
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语句之前的代码是否同步执行?
答案 0 :(得分:2)
换句话说,第一个await语句之前的代码是否同步执行?
是的。
在规范25.7.5.1中进行了指定:
25.7.5.1 AsyncFunctionStart(promiseCapability,asyncFunctionBody)
[用于在某些时候恢复执行的逻辑]
将asyncContext推送到执行上下文堆栈;现在asyncContext是正在运行的执行上下文。
恢复对asyncContext的暂停评估。令result为恢复后的返回值 计算。
声明:当我们返回此处时,asyncContext已从执行上下文堆栈中删除,并且 runningContext是当前正在运行的执行上下文。
声明:结果是正常完成,值为undefined。完成值的可能来源是 等待,或者,如果异步功能什么也没有等待,请执行上面的步骤3.g。
此操作在调用异步函数时运行,并且可以看到它直接执行 asyncContext ,而无需等待任何操作。但是,如果引擎到达await
,则会主动中止执行:
6.2.3.1等待
[设置逻辑以继续运行]
- 从执行上下文堆栈中删除asyncContext并还原位于顶部的执行上下文 执行上下文堆栈作为运行中的执行上下文。