众所周知js是单线程,所以在执行代码的时候如果全是是同步,代码量又大执行效率就很慢,所以就有了异步代码
异步是在不影响同步代码的情况下运行的代码,如果细分他又有宏任务和微任务
在同步执行完以后第一时间执行微任务,微任务执行完以后去执行宏任务,宏任务执行完后看看是不是又有微任务,如果有就去先执行微任务(这里注意的是我们最开始执行的script就是最开始的宏任务)
执行顺序:同步-》微任务-》宏任务
然后我们看这个代码,会了这个基本就知道执行顺序了
console.log("aa");
function workFun(mac) {
console.log("bb");
if (mac) {
console.log(mac);
}
return new Promise((resolve, reject) => {
console.log("cc");
resolve("dd")
})
}
setTimeout(() => {
console.log("ee");
setTimeout(() => {
console.log("ff");
}, 0)
workFun("gg").then(res => {
console.log('hh', res);
})
}, 0)
workFun().then(res => {
console.log(res);
})
console.log("kk")
第一行是同步输出aa
下面是一个workFun的函数,没调用,跳过,调用再看
一个定时器setTimeout,这个是异步宏任务,后面执行,跳过
下面有调用之前的函数workFun,进入执行,函数同步代码输出 bb
返回的promise内是同步任务,他的resolve是异步微任务,先放着,所以这里输出cc
最后输出kk,这里同步就输出完了
下面是微任务输出时间 输出刚才的resolve的dd,then就打印出来了,dd
这时候只剩下setTimeout,我们执行setTimeout
第一步输出ee
然后又遇见一个setTimeout,跳过
遇见workFun,注意这里传入gg,代码内部是一个判断输出的,所以这里安装上面的步骤应该输出bb gg cc
然后后面没有代码了,同步执行完成,执行异步微任务 resolve("dd"),.then打印出hh dd
没有微任务了最后我们再执行异步宏任务就是前面的setTimeout,这个setTimeout内部没有其他代码,只有ff,输出打印,代码结束
结果为:
aa bb cc kk dd ee bb gg cc hh dd ff
运行代码查看结果
差不多这样,如果我有错误的地方请指正哦,让我们共同学习,谢谢!