直接先来看一道题:
async function async1() { console.log('async1 start') await async2() console.log('async1 end') } async function async2() { console.log('async2') } console.log('script start') setTimeout(function() { console.log('setTimeout0') }, 0) setTimeout(function() { console.log('setTimeout3') }, 3) setImmediate(() => console.log('setImmediate')) process.nextTick(() => console.log('nextTick')) async1() new Promise(function(resolve) { console.log('promise1') resolve() console.log('promise2') }).then(function() { console.log('promise3') }) console.log('script end')
按照“正常”的理解 一般会认为输出结果为:
script strat 但实际上的结果为:script strat
async1 start async1 start
async2 async2
*async1 end promise1
promise1 promise2
promise 2 script end
script end nextTick
nextTick async1 end
promise 3 promise3
setTimeout0 setTimeout0
setImmediate setImmediate
setTimeout3 setTimeout3
问题的关键就在于怎么理解为什么 async2 之后输出的不是 async1 end 而是promise1。
这里我直接说下个人理解的结论,
1.async函数会返回一个promise对象
2.async函数遇到await,时执行完await的任务后会先返回,等到await表达式中的 Promise 解析完成后继续执行 async 函数并返回解决结果
3.await表达式中的 Promise 解析完成是指await时会向本轮循环的微任务队列中添加一个空的promise回调,待回调完成即代表Promise 解析完成
根据上述三点再来看问题中的代码。
至于其他的细节可以参考这篇文章:http://www.inode.club/node/event_loop.html#%E8%AF%A6%E7%BB%86%E8%AE%B2%E8%A7%A3
标签:function,async1,console,log,EventLoop,async,await From: https://www.cnblogs.com/qkq505/p/16705492.html