效果
在执行某一个任务中,可以添加其他任务进去执行。
例如: 打印 “1” 过程中,突然想打印“2”;
结果: 11111211112
思路
1、 把任务用数组保存起来,执行时就弹出数组中的任务
2、任务单一原则设计
3、 插入任务时,直接把任务插入数组中即可
代码
任务单一原则
function task() {
const startTime = performance.now();
let span = document.createElement('span');
span.innerText = 1;
while (performance.now() - startTime < 1) {
// 阻塞 1 ms
}
container.appendChild(span);
}
function highPriorityTask() {
const startTime = performance.now();
let span = document.createElement('span');
span.style.color = 'red';
span.innerHTML = '<strong>插队任务</strong>';
while (performance.now() - startTime < 1) {
// 阻塞 1 ms
}
container.appendChild(span);
}
初始化任务
const taskQueue = Array.from({ length: 1000 }, () => task);
执行任务
function performWorkUnit() {
// 任务执行完毕后结束递归
if (taskQueue.length === 0) {
btn.innerText = '执行';
return;
}
requestIdleCallback((deadline) => {
let task;
while (
(task = taskQueue.pop()) &&
!deadline.didTimeout &&
deadline.timeRemaining() > 0
) {
task();
}
performWorkUnit();
});
}
插入任务
askQueue.push(highPriorityTask);