/**
* 分时执行函数封装
* @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);
分时执行函数封装
于 2024-12-29 17:39:55 首次发布