分时执行函数封装

/**
 * 分时执行函数封装
 * @param {*} tasks 待执行任务数组
 * @param {*} scheduler 调度器(可选)
 * scheduler由调用者传入,不传使用内部默认调度器
 * scheduler执行时,将当前任务作为参数丢给外部,由外部决定合适执行该任务,
 * isGoOn:执行chunkTask的时候,外部还需传入一个isGOOn函数,内部根据函数返回值,判断是否往后执行后续任务
 * @returns
 */
export default function performanceTask(tasks, scheduler) {
  if (!Array.isArray(tasks) || tasks.length === 0) return;

  if (!scheduler || typeof scheduler !== "function") {
    if (typeof requestIdleCallback === "function") {
      scheduler = (chunkTask) => {
        requestIdleCallback((deadLine) => {
          chunkTask(() => deadLine.timeRemaining() > 0);
        });
      };
    } else {
      scheduler = (chunkTask) => {
        setTimeout(() => {
          chunkTask(() => true);
        }, 0);
      };
    }
  }
  let executeIndex = 0;
  //捕获到错误,不往后执行
  let catchError = false;
  function _run() {
    scheduler((isGoOn) => {
      while (executeIndex < tasks.length && isGoOn() && !catchError) {
        try {
          tasks[executeIndex++]();
        } catch (error) {
          catchError = true;
          console.error(`task_${executeIndex} execute failed`, error);
        }
      }
      if (!catchError && executeIndex < tasks.length) {
        _run();
      }
    });
  }
  _run();
}

// 测试代码
// const tasks = Array.from({ length: 300000 }, (v, i) => () => {
//   const root = document.querySelector("#root");
//   const div = document.createElement("div");
//   div.innerHTML = i;
//   root.appendChild(div);
// });
// const scheduler = (chunkTask) => {
//   setTimeout(() => {
//     const now = performance.now();
//     chunkTask(() => performance.now() - now < 1);
//   }, 1000);
// };
// performanceTask(tasks,scheduler);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值