didact icon indicating copy to clipboard operation
didact copied to clipboard

help: Confused with 'requestIdleCallback(workLoop)'

Open KelvinQiu802 opened this issue 2 years ago • 2 comments

In Step III: Concurrent Mode, I learn that: requestIdleCallback(func) will call the call back function when the browser is idle. But in workLoop function, that while loop confused me.

function workLoop(deadline) {
  let shouldYield = false
  while (nextUnitOfWork && !shouldYield) {
    nextUnitOfWork = performUnitOfWork(
      nextUnitOfWork
    )
    shouldYield = deadline.timeRemaining() < 1
  }
  requestIdleCallback(workLoop)
}

My question is: if shoudYield is false, it means that the browser is busy, so we should stop calling the next unit of work. But in this while loop, if shoudYield is false, the loop will continue and do the next unit of work. Why?

KelvinQiu802 avatar Aug 18 '22 09:08 KelvinQiu802

if shoudYield is false, it means that the browser is busy, so we should stop calling the next unit of work

It's the opposite. shouldYield means "should stop". If shouldYield is false it means we should continue performing units of work.

pomber avatar Aug 18 '22 09:08 pomber

HaHa~, it's my mistake! Here is the doc about the return value.

Returns a DOMHighResTimeStamp, which is a floating-point value providing an estimate of the number of milliseconds remaining in the current idle period.

So deadline.timeRemaining() < 1 means that there is no remaining time to do the work, we should break the while loop and request another callback.

Thank you! Love your amazing project, I will continue learning with it.

KelvinQiu802 avatar Aug 18 '22 10:08 KelvinQiu802