使用场景:
前端页面中需要同时发送 20 个请求,但是服务端有限制,需要前端控制并发数,保证最多只能同时发送 n 个请求;
要求:
-
最多同时执行的任务数为 n 个;
-
当前任务执行完成后,释放队列空间,自动执行下一个任务;
-
所有任务添加到任务队列后,自动开始执行任务;
代码实现:
class TaskQueue {
tasks: Array<{ task: Function, resolve: Function, reject: Function }>;
limitCount: number;
runingCount: number;
constructor(limitCount = 2) {
this.limitCount = limitCount; // 并发数量
this.runingCount = 0; // 正在运行的任务数
this.tasks = []; // 任务列表
}
add(task: Function) {
// 用 new Promise 包裹,可使用 promise 相关操作
return new Promise((resolve, reject) => {
this.tasks.push({ task, resolve, reject });
this._run();
});
}
private _run(): void {
while (this.runingCount < this.limitCount && this.tasks.length) {
const { task, resolve, reject } = this.tasks.shift();
this.runingCount++;
task()
.then(resolve, reject)
.finally(() => {
this.runingCount--;
this._run();
});
}
}
}
算法基础🔮 动态规划基础
上一篇