💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[danger] 阅读以下代码, 说出打印顺序 ---- ~~~ async function async1(){ console.log('async1 start'); await async2(); console.log('async1 end') } async function async2(){ console.log('async2') } console.log('script start'); setTimeout(() => { console.log('setTimeout') }, 0); async1(); new Promise((resolve) => { console.log('promise1'); resolve(); }).then(() => { console.log("promise2"); }).then(() => { console.log("promise2_then") }); ~~~ 打印结果如下: ~~~ // script start // async1 start // async2 // promise1 // async1 end // promise2 // promise2_then // setTimeout ~~~ 解释: 主线程执行完毕, 执行所有微任务, 最后执行宏任务 ``` async function async1(){ console.log('async1 start'); // 3. 主线程打印 await async2(); // 4. 从右向左, 调用async2()函数执行 console.log('async1 end') // 8. 开始执行 } async function async2(){ console.log('async2') // 5. 打印 (打印后回到第4步, 遇到await扔到任务队列等待) (标记微任务) } console.log('script start'); // 1. 主线程执行 setTimeout(() => { console.log('setTimeout') // 11. setTimeout/ setInterval都是宏任务, 在所有微任务执行完毕, 再按照顺序执行宏任务. }, 0); async1(); // 2. 主线程调用方法, 跳到async1函数执行 new Promise((resolve) => { console.log('promise1'); // 6. 主线程继续, new Promise()马上执行里面代码 resolve(); // 7. 微任务进入队列等待. (主线程结束, 按照刚才微任务顺序, 先执行上面的微任务) }).then(() => { console.log("promise2"); // 9. 执行 }).then(() => { console.log("promise2_then") // 10. 执行 }); ```