事宜轮回(EventLoop)的进修总结

媒介

在进修eventloop之前,我们须要温习一下js的单线程和异步。

虽然说js是单线程的,但是在浏览器和Node中都做了响应的处置惩罚。如浏览器中的web workers(事情线程),Node中的child_process(子历程)。它们的涌现对大批盘算的剖析起到了促进作用。

事宜轮回

当历程启动时,Node会建立一个tick轮回,每一个tick轮回经由过程内部的观察者来检察是不是有事宜须要处置惩罚,假如有就掏出事宜和它相干的回调函数去实行,实行完今后就进入下一个轮回,假如不再有就退出历程。

浏览器中的eventloop

在浏览器中把异步事宜放到事情线程中,防止壅塞主线程UI的衬着

  console.log('历程最先')
  const ajax = new XMLHttpRequest()
  ajax.addEventListener('load', () => {
    console.log('load')
  })
  ajax.addEventListener('loadend', () => {
    if (ajax.readyState == 4 && ajax.status == 200) {
      console.log('ajax success')
      } else {
      console.log('ajax success')
      }
  })
  ajax.open('get', 'http://localhost/study/html/vue.js')
  ajax.send()
  setTimeout(() => {
    console.log('setTimeout')
  }, 300)
  fetch('http://localhost/study/html/demo.json',{
    headers: {
      'content-type': 'application/json'
    }
  }).then(res => {
    console.log('fetch')
  })
  let i = 0
  while(i < 10000) {
    i++
  }
  console.log(i)
  console.log('历程完毕')

从效果能够看出三种异步处置惩罚不壅塞主线程代码的实行,而ajax、fetch、setTimeout依据代码处置惩罚完毕的先厥后实行回调函数。

Nodejs中的eventloop

Node中的事宜轮回依据观察者的优先级来实行,同一个轮回内的process.nextTick -> setTimeout -> setImmediate

setTimeout(() => {
  console.log('setTimeout')
}, 0)
setImmediate(() => {
  console.log('setImmediate1')
  process.nextTick(() => {
    console.log('setImmediate1 插进去nextTick')
  })
})
setImmediate(() => {
  console.log('setImmediate2')
})
process.nextTick(() => {
  setTimeout(() => {
    console.log('nextTick1 setTimeout')
  }, 100)
  console.log('nextTick1')
})
process.nextTick(() => {
  console.log('nextTick2')
})
console.log('一般实行')

总结

事宜轮回的实行特性,源于应用单线程,阔别多线程死锁、状况同步等题目;应用异步让单线程阔别壅塞,以更好的运用CPU。

    原文作者:孙小渃
    原文地址: https://segmentfault.com/a/1190000016067071
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞