You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
setTimeout(()=>{
console.log('setTimeout1')
},0)
let p = new Promise((resolve, reject)=>{
console.log('Promise1')
resolve()
})
p.then(()=>{
console.log('Promise2')
})
案例,打印顺序
答案:
同步任务和异步任务会进入不同的执行场所,同步任务会进入到主线程,异步的进入Event Table并注册函数
当指定的事情完成时[如:setTimeout的倒计时事件结束],
Event Table
会将这个任务移入Event Queue
主线程内的任务执行完毕为空,会去Event Queue中读取对应的函数,放到主线程中执行
上述过程会不断的重复,就是Event Loop
微任务和宏任务皆为异步任务,它们都属于一个队列,主要区别在于他们的执行顺序,Event Loop的走向和取值。
而宏任务一般是:包括整体代码script,setTimeout,setInterval、setImmediate
微任务:原生Promise、process.nextTick、MutationObserver
setTimeout:异步可以延迟执行,如:
setTimeout(() => console.log('延迟3秒执行'), 3000)
结果:
解释:
task()进入Event Table并注册,计时开始
执行console.log函数
执行sleep函数,计时继续
3秒到了,计时时间setTimeout完成,task()进入Event Queue,等待sleep执行完成
sleep完成,task()从Event Queue进入主线程执行
关于setTimeout要补充的是,即便主线程为空,0毫秒实际上也是达不到的。根据HTML的标准,最低是4毫秒。有兴趣的同学可以自行了解
setInterval 循环执行,每隔定量时间将注册的函数fn()移入Event Queue
不同类型的任务会进入对应的Event Queue,比如setTimeout和setInterval会进入相同的Event Queue。
Promise
输出:Promise1,Promise2,setTimeout1
Promise参数中的Promise1是同步执行的,其次是因为Promise是microtasks,会在同步任务执行完后去清空microtasks queue,最后清空完微任务再去宏任务队列取值。
分析:
第一次事件循环流程
| 宏任务 | 微任务 |
| setTimeout1 | process1 |
| setTimeout2 | then1 |
第一次事件循环结束,清空微任务队列,执行process1,输出6,执行then1,输出8;
第二次事件循环流程
| 宏任务 | 微任务 |
| setTimeout2 | process2 |
| | then2 |
第二次事件循环结束,清空微任务队列,执行promise2,输出3,执行then2,输出5
第三次事件循环,将宏任务setTimeout2移入主线程,执行流程如上,输出:9、11、10、12
node环境:v12.13.0
The text was updated successfully, but these errors were encountered: