[英]order of execution in async/await
我一直在研究 promise、await 和 async 函数。 当我刚刚处于学习 promises 的阶段时,我偶然发现了这个:
async function async1(){ console.log('Async 1'); await async2(); // * console.log('AFter Async 1'); } async function async2(){ console.log('FROM async 2'); } async1(); console.log('Synchronous'); //**
结果是:
Async 1
FROM async 2
Synchronous
AFter Async 1
代码如何从 * 跳转到 **。 这里如何使用微任务?
执行您询问的特定序列(从*
到**
)不涉及微任务,尽管微任务在该序列期间排队(然后稍后运行)。
async
function 是同步的,直到第一次await
或return
(包括隐式返回,其中代码执行只是“脱离”函数的末尾)。 此时,function 返回 promise 并从调用 function 的点继续执行同步。 如果它是return
或隐式返回(不是await
),则会排队等待一个微任务来解决 function 中的 promise。
我用黄色突出显示了该代码的同步部分:
在您的示例中,当您在底部调用async1
时,它的同步部分运行(记录Async 1
然后调用async2
,它在其同步部分记录FROM async 2
); 运行async2
并从中获得 promise, async1
到达await
并返回它自己的 promise; 然后同步执行在你调用它之后继续,记录Synchronous
。
在这个特定的例子中,在*
和**
部分之间,一个用于完成async2
的 promise 的微任务被排队。 当您的示例中执行同步代码的任务完成时,该微任务将从微任务队列中提取并执行——这将从等待它的async1
中解决 promise; async1
的代码继续,记录它的日志,然后隐式返回,因此微任务排队处理该结算(在本例中为履行),并在async2
微任务执行完成后从微任务队列中提取。 但是没有什么在等待promise,所以和解没有任何明显的效果。
async function async1(){ // 1
console.log('Async 1'); // 2
await async2(); // * // 3
console.log('AFter Async 1'); // 4
} // 5
// 6
async function async2(){ // 7
console.log('FROM async 2'); // 8
} // 9
// 10
async1(); // 11
console.log('Synchronous'); //** // 12
首先,在第 11 行,执行 function async1()
并立即从第 2 行记录Async 1
。
在第 3 行, await
暂停async1()
的执行,直到 promise 稳定,promise 稳定, FROM async 2
记录,并将一个微任务放入作业队列以继续执行async1
( async2()
同步执行,因为 async没有等待表达式的 function 只会同步运行)。
现在,第 12 行执行并记录Synchronous
。 之后,由于调用堆栈为空,队列中的微任务可以继续执行,我们最终得到AFter Async 1
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.