简述我对event loop的理解

Javascript是单线程的,那么各个任务进程是按照什么样的规范来执行的呢?这就涉及到Event Loop的概念了,EventLoop是在html5规范中明确定义的;

何为eventloop,javascript中的一种运行机制,用来解决浏览器单线程的问题

Event Loop是一个程序结构,用于等待和发送消息和事件。

同步任务、异步任务、微任务、宏任务

javascript单线程任务从时间上分为同步任务异步任务,而异步任务又分为宏任务(macroTask)微任务(microTask)

宏任务:主代码块、setTimeOut、setInterval、script、I/O操作、UI渲染

微任务:promise、async/await(返回的也是一个promise)、process.nextTick

在执行代码前,任务队列为空,所以会优先执行主代码块,再执行主代码块过程中,遇到同步任务则立即将任务放到调用栈执行任务,遇到宏任务则将任务放入宏任务队列中,遇到微任务则将任务放到微任务队列中,主线程任务执行完之后,先检查微任务队列是否有任务,有的话则将按照先入先出的顺序将先放进来的微任务放入调用栈中执行,并将该任务从微任务队列中移除,执行完该任务后继续查看微任务队列中是否还有任务,有的话继续执行微任务,微任务队列null时,查看宏任务队列,有的话则按先进先出的顺序执行,将任务放入调用栈并将该任务从宏任务队列中移除,该任务执行完之后继续查看微任务队列,有的话则执行微任务队列,没有则继续执行宏任务队列中的任务。

需要注意的是每次调用栈执行完一个宏任务之后,都会去查看微任务队列,如果microtask queue部位空,则会执行微任务队列中的任务,直到微任务队列为空再返回去查看执行宏任务队列中的任务

简述我对event loop的理解_第1张图片

 

console.log('script start')

async function async1() {
  await async2()
  console.log('async1 end')
}
async function async2() {
  console.log('async2 end') 
}
async1()

setTimeout(function() {
  console.log('setTimeout')
}, 0)

new Promise(resolve => {
  console.log('Promise')
  resolve()
})
  .then(function() {
    console.log('promise1')
  })
  .then(function() {
    console.log('promise2')
  })

console.log('script end')

 

::最终输出::

script start
VM70:8 async2 end
VM70:17 Promise
VM70:27 script end
VM70:5 async1 end
VM70:21 promise1
VM70:24 promise2
undefined
VM70:13 setTimeout

解析

在说返回结果之前,先说一下async/await,async 返回的是一个promise,而await则等待一个promise对象执行,await之后的代码则相当于promise.then()

async function async1() {
  await async2()
  console.log('async1 end')
}
async function async2() {
  console.log('async2 end') 
}

//等价于
new Promise(resolve => 
resolve(console.log('async2 end'))
).then(res => {
console.log('async1 end')
})

先执行同步任务  script start  -> async2 end   ->  await之后的console被放入微任务队列中 -> setTime被放入宏任务队列中  ->promise  -> promise.then被放入微任务队列中  -> script end  -> 同步任务执行完毕,查看微任务队列  --> async1 end -> promise1  -> promise2 --> setTimeout

你可能感兴趣的:(javascript笔记)