某些场景会有很多并发需求,比如用户的上传、富文本编辑、下载等场景。但是过多的任务会导致页面性能下降甚至卡死,所以需要对任务的并发量限制在一定范围内,有序可控,提高页面稳定性。
以下以Promise任务为例,控制运行任务:
class limitPromise {
constructor(max) {
this.max = max || 2;
this.task_queue = [];
}
add(task) {
this.task_queue.push(task);
}
run() {
if (!this.task_queue.length) return;
let min = Math.min(this.task_queue.length, this.max);
for (let i = 0; i < min; i++) {
this.max--;
let task = this.task_queue.shift();
task()
.then((res) => {
console.log(res);
})
.finally(() => {
this.max++;
this.run();
});
}
}
addTask(result, time) {
let task = () =>
new Promise((res, rej) => {
setTimeout(() => {
res(result);
}, time * 1000);
});
this.add(task);
}
}
let taskHandle = new limitPromise(3);
taskHandle.addTask(1, 1);
taskHandle.addTask(3, 8);
taskHandle.addTask(7, 3);
taskHandle.addTask(5, 4);
taskHandle.addTask(6, 5);
taskHandle.run();