https://juejin.cn/post/7033959714794766372

requestIdleCallback可以告知当前帧剩余时间

setTimeout有4ms延迟,没有RIC精确

<body>
    <div><button id="btn1">渲染十万条</button></div>
<div><button id="btn2">requestIdleCallback 渲染十万条</button></div>
<div><button id="btn3">clear</button></div>
<div style="display: flex;">
  <ul id="list1"></ul>
  <ul id="list2"></ul>
</div>

<script>
  const NUM = 100000
  // 方案一:无脑添加
  const NUM1 = NUM;
  let list1 = document.getElementById("list1");
  document.getElementById("btn1").addEventListener('click', bigInsert1);
  function bigInsert1() {
    let i = 0;
    while (i < NUM1) {
      let item = document.createElement("li");
      item.innerText = `第${i++}条数据`;
      list1.appendChild(item);
    }
  }
  // 方案二:时间切片
  const NUM2 = NUM
  let list2 = document.getElementById("list2");
  let f = document.createDocumentFragment();
  let i = 0;
  let timer =null

  document.getElementById("btn2").addEventListener('click', () => {
    timer = requestIdleCallback(bigInsert2);
  });
  function bigInsert2(deadline) {
    while (deadline.timeRemaining() > 10 && i < NUM2) {
      console.log('空闲执行中');
      let item = document.createElement("li");
      item.innerText = `第${i++}条数据`;
      list2.appendChild(item)
      if (i%100 === 0) break; // 每次渲染 100 条
    }

    if (i < NUM2) {
      timer = requestIdleCallback(bigInsert2)
    }
  }
  document.getElementById("btn3").addEventListener('click', ()=>{
    list1.innerHTML = '';
    list2.innerHTML = '';
    cancelIdleCallback(timer);
    i = 0;
  });
</script>
  </body>