jtwang7 / React-Note

React 学习笔记
8 stars 2 forks source link

React 异步操作回收 #62

Open jtwang7 opened 1 year ago

jtwang7 commented 1 year ago

React 异步操作回收

计时器回收

计时器我们可以用对应的注销方法来回收计时器的异步回调

useEffect(() => {
  const id = requestAnimationFrame(startAnimate1);
  const timerId = setTimeout(startAnimate2);
  const intervalId = setInterval(startAnimate3);
  return () => {
    cancelAnimationFrame(id);
    clearTimeout(timerId);
    clearInterval(intervalId);
  }
}, []);

插桩回收

针对 Promise 这类没有原生回收方案的的异步操作,比较通用的方法是插桩回收

useEffect(() => {
  let canceled = false
  fetchData(pageIindex).then(resp => {
    if (canceled) {
      return;
    }
    // DO SOMETHING UI UPDATE
  });
  return () => canceled = true;
}, [pageIndex]);

上面的代码,定义了一个标志位(canceled),通过函数闭包在异步回调的时候,判断是否标志位已经过期(canceled = true),如果过期,不执行回调。