react学习系列—— Scheduler为何不用setTimeout执行宏任务队列

66 阅读1分钟

demo1 setTimeOut

let time = 0 
let nowTime = +new Date()
let timer
const poll = function(){
    timer = setTimeout(()=>{
        const lastTime = nowTime
        nowTime = +new Date()
        console.log( '递归setTimeout(fn,0)产生时间差:' , nowTime -lastTime )
        poll()
    },0)
    time++
    if(time === 20) clearTimeout(timer)
}
poll()

截屏2024-03-08 15.31.53.png

3a2e0402f029619b9a9e21fca426612c.png

setTime递归调用超过5层,会导致时间差到5ms

demo2 MessageChannel

  channel.port1.onmessage = function(){
      /* 执行任务 */
      scheduledHostCallback() 
  };
  /* 向浏览器请求执行更新任务 */
  requestHostCallback = function (callback) {
    scheduledHostCallback = callback;
    port.postMessage(null);
  };
  function cb () {
    const lastTime = nowTime
    nowTime = +new Date()
    console.log( '递归MessageChannel(fn)产生时间差:' , nowTime -lastTime )
    if (times < 20) {
      console.log(times)
      times++
      requestHostCallback(cb)
    }
  }
  requestHostCallback(cb)

截屏2024-03-08 15.35.50.png

2f8e7c4a0bfc71bbec89b7db3eb73746.png