JS的执行顺序 setTimeout与Promise async/await

今天碰到一个很经典js执行顺序的题 代码不是很长
问的是console.log的输出顺序
这道题涉及到的知识点还挺多的
async function async1() {
    console.log("async1start");
    await async2();
    console.log("async1end");
}
//函数2
async function async2() {
    console.log('async2')
}
console.log("scriptstart");
setTimeout(function () {
    console.log("settimeout");
}, 0)

async1()
new Promise(function (resolve) {
    console.log("promise1");
    resolve();
}).then(function () {
    console.log("promise2");
});
console.log('script end');
  
  //执行结果
   scriptstart
   async1start
   async2
   promise1
   script end
   async1end
   promise2
   settimeout
js 单线程的 它会先执行一些同步操作 所以先输出的就是scriptstart
然后是async1start async声明的函数虽然执行异步 但是他也是属于同步的写法
和async同时出现的await 会强迫其他代码等待自己执行完之后再执行 所以第三个输出async2
然后再继续 输出 promise1和script end
async1end最后一个同步代码输出完毕
剩下的就是promise的.then里边的异步 和 settimeout 这里涉及到异步的宏任务和微任务 settimeout 属于宏任务,promise属于微任务
主线程执行完了之后先从微任务栈里面获取微任务执行,没有微任务了,就去宏任务栈里面获取宏任务执行,所以在一个循环内,微任务是比宏任务先执行的
所以setTimeout在最后被执行
posted @   哈哈O0O  阅读(679)  评论(0编辑  收藏  举报
编辑推荐:
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
阅读排行:
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 【译】我们最喜欢的2024年的 Visual Studio 新功能
· 如何打造一个高并发系统?
点击右上角即可分享
微信分享提示