js-day24-事件轮询机制 Event Loop

69 阅读1分钟

js 是单线程执行的

js中的任务按顺序一个一个的执行,但是一个任务耗时太长,那么后面的任务就需要等待,为了解决这种情况,将任务分为了同步任务和异步任务,而异步任务又可以分为微任务和宏任务

  • 调用栈(call stack): js执行代码的区域,遵循先进后出
  • 任务队列(先进先出):
    • 宏任务队列(任务优先级低):放在里面的有:script整体代码、setTimeout、setINterval、I/O、...
    • 微任务队列(任务优先级高):目前我所知道的放在微任务队列里的有:Promise.then()、...
  • WEB API(提供异步机制,将要执行的代码分配给任务队列,延时任务在时间结束后才能分配)

事件轮询机制流程

  1. 调用栈先执行一遍js整体代码,执行过程中,同步代码直接执行,异步代码交给WEB API分配,出栈
  2. 调用栈执行完毕后,WEB API分配任务,将宏任务交给宏任务队列,微任务放在微任务队列
  3. 事件轮询首先询问微队列:如果有就清空执行完微队列,然后执行宏队列,再web api 分配,再执行微队列 ,循环往复

image.png

例题

image.png

console.log(1)

setTimeout(() => {
  console.log(2)
}, 0)
new Promise(resolve => {
  console.log(3)
  resolve()
}).then(() => {
  console.log(4)
})
setTimeout(() => {
  console.log(5)
  new Promise(resolve => {
    console.log(6)
    setTimeout(() => {
      console.log(7)
    })   
    resolve()
  }).then(() => {
    console.log(8)
  })
}, 500)
new Promise(resolve => {
  console.log(9)
  resolve()
}).then(() => {
  console.log(10)
 setTimeout(() => {
    console.log(11)
  }, 0)
})
console.log(12)

根据上面方法,判断这段代码的输出? 结果在最后 *

上面这段代码的输出结果是

1 3 9 12 4 10 2 11 5 6 8 7

你算对了吗