复习一下JS事件循环

例子

   

async function test1() {
  console.log("test1 begin") 
  const result = await test2()
  setTimeout(() => {
    console.log(‘timeOut2‘)
  }, 0)
  console.log("test1 end")
}
async function test2() {
  console.log("test2")
}
console.log("script begin")
test1()
setTimeout(() => {
  console.log(‘timeOut1‘)
}, 0)
new Promise(resolve=>{
  console.log(‘Promise‘)
  resolve()
}).then(
  setTimeout(() => {
    console.log(‘timeOut3‘)
  }, 0)  
).then(()=>{
  console.log(‘resolve‘)
})
console.log("script end")

 

分析:

  1. 首先执行主线程的同步代码  ‘script begin ‘  然后执行 test1()   

    --结果:  script begin

  2. test1 执行 ‘test1 begin‘ 遇到 await 先执行 ‘test2‘ 执行完毕后等待 等后续都执行完再继续执行后续 

    --结果:  script begin => test1 begin => test2

  3. 由于等待 跳出test1()   宏队列中放入 timeOut1 遇到Promise 直接执行 ‘Promise‘ 后面的.then是异步任务 放入微队列  timeOut3放入宏  

    --结果:  script begin => test1 begin => test2 => Promise

  4. 继续向下执行 promise后面 执行 ‘script end‘  然后就全部执行完毕了  回到  await test2()  宏队列中放入 timeOut2 执行 ‘test1 end‘

    --结果:  script begin => test1 begin => test2 => Promise => ‘script end‘ => ‘test1 end‘

  5. 然后执行微队列  ‘resolve‘  然后执行宏队列  timeOut1  timeOut3  timeOut2

    --结果:  script begin => test1 begin => test2 => Promise => ‘script end‘ => ‘test1 end‘ => ‘resolve‘ => ‘timeOut1‘ => ‘timeOut3‘ => ‘timeOut2‘

 

个人学习  不对之处欢迎指正

复习一下JS事件循环

上一篇:JSP


下一篇:spring线程并发处理(ThreadLocal)