JavaScript中async/await执行疑问:console.log('end')为何不执行两次?
async/await代码执行逻辑说明
先拆解这段代码的执行顺序:
- 首先运行最外层的同步代码,
console.log('start')输出start。 - 调用
withoutAwait():这是async函数,但内部没有await,所以函数体全程同步执行,直接输出without await,之后函数返回一个已完成状态的Promise,但这个Promise不会干扰后续同步代码的执行。 - 调用
withAwait():进入函数后碰到await 0,此时JS会把await之后的代码(也就是console.log('with await'))放进微任务队列,然后暂停当前函数,主线程回到同步代码继续执行。 - 执行
console.log('end'),输出end——这行代码在同步流程里只写了一次,所以只会执行一次。 - 等主线程所有同步代码都跑完,才会处理微任务队列里的任务,这时候才会执行
withAwait()里剩下的console.log('with await'),输出with await。
你觉得end会执行两次,是对async/await的机制有误解:它只是用来安排异步代码的执行时机,不会让同步代码重复执行。console.log('end')在代码里仅出现一次,自然只会被调用一次。
内容的提问来源于stack exchange,提问作者Michael36
相关产品推荐
相关产品推荐

