事件循环机制-宏任务微任务


代码执行顺序

  • 1. 先执行同步的代码
    
    2. 再执行process.nextTick
    
    3. 执行异步代码
       3.1 异步分为宏任务和微任务, 计时器 、ajax 、读取文件都是宏任务,Promise的then方法是微任务,微任务先执行
       3.2 异步的代码放在任务队列里执行
    
    4. *** setImmediate 会在本次事件循环结束之后  、下次事件循环开始之前执行 !
        4.1 事件循环,一次事件循环找到多少个任务此次就执行多少个任务,没有就不执行。每次事件循环都可能找到任务或找不到任务,不管找到找不到,本次事件循环都会结束,结束之后重新开始新一次的事件循环,重新开始查找任务,找到执行,找不到不执行!setImmediate就是第一次事件循环结束后,下一次事件循环之前执行的。
        事件循环会不断的检测任务队列有没有任务可执行。
    
    process.nextTick 与 setImmediate 都是在node使用场景多。这两个方法在node的才能运行,在浏览器运行不了。
    
    
setImmediate(() => {
  console.log('本轮事件循环结束,下次事件循环未开始之前执行(setImmediate)', 1)
})

setTimeout(() => console.log('异步宏任务后执行,若无其他任务,本轮事件循环结束',9), 0)
setTimeout(() => console.log('下一轮事件循环开始执行(宏任务)',3), 100)
console.log('同步执行(运行栈)',2)

new Promise((resolve, reject) => {
  console.log('同步执行',6) // 这里也是同步的
  resolve()
})
  .then(() => {
    console.log('异步微任务先执行(then)', 8)
  })

process.nextTick(() => {
  console.log('同步之后执行(process.nextTick)', 5)
})
// 以上代码执行顺序
同步执行(运行栈) 2
同步执行 6
同步之后执行(process.nextTick) 5
异步微任务先执行(then) 8
异步宏任务后执行,若无其他任务,本轮事件循环结束 9
本轮事件循环结束,下次事件循环未开始之前执行(setImmediate) 1
下一轮事件循环开始执行(宏任务) 3

文章作者: KarlFranz
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 reprint policy. If reproduced, please indicate source KarlFranz !
评论
  目录