TaskQueue类通过控制并发数管理异步任务执行顺序,使用Promise实现任务队列,支持按序执行、限制并发及错误处理,在爬虫、上传等场景中有效避免资源竞争。

在JavaScript中处理异步操作时,任务队列是一种常见的控制执行顺序的方式。尤其在需要按顺序执行多个异步任务、限制并发数量或实现重试机制时,一个简单的任务队列非常有用。下面是一个基于Promise的轻量级任务队列实现。
我们定义一个 TaskQueue 类,用于管理异步任务的添加和执行。每个任务都是一个返回 Promise 的函数(也称为“任务函数”),队列会按顺序或指定并发数执行它们。
class TaskQueue {
constructor(concurrency = 1) {
this.concurrency = concurrency; // 最大并发数
this.running = 0; // 当前正在运行的任务数
this.queue = []; // 任务队列
}
// 添加任务
push(task) {
return new Promise((resolve, reject) => {
this.queue.push({
task,
resolve,
reject
});
this.next();
});
}
// 执行下一个任务
next() {
while (this.running < this.concurrency && this.queue.length > 0) {
const { task, resolve, reject } = this.queue.shift();
this.running++;
task()
.then(resolve, reject)
.finally(() => {
this.running--;
this.next(); // 继续执行下一个
});
}
}
}
下面是一个模拟异步任务(如网络请求)的例子,使用 setTimeout 模拟延迟。
// 创建一个最多同时运行2个任务的队列
const queue = new TaskQueue(2);
// 生成一个异步任务
function createTask(id, delay) {
return () => {
console.log(`任务 ${id} 开始`);
return new Promise(resolve => {
setTimeout(() => {
console.log(`任务 ${id} 完成`);
resolve(`结果-${id}`);
}, delay);
});
};
}
// 添加多个任务
queue.push(createTask(1, 1000));
queue.push(createTask(2, 500));
queue.push(createTask(3, 800));
queue.push(createTask(4, 300));
// 可以监听任务完成
queue.push(createTask(5, 600)).then(result => {
console.log('最终任务完成:', result);
});
输出将显示任务按并发限制逐步执行:1 和 2 先开始,随后是 3、4,最后是 5,但不会超过两个任务同时运行。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
这个基础版本可以进一步增强:
基本上就这些。通过封装任务调度逻辑,我们可以更好地控制异步流程,避免资源竞争或过多并发请求带来的问题。这种模式在爬虫、批量上传、定时任务等场景中非常实用。
以上就是使用JavaScript实现一个简单的任务队列_js异步编程的详细内容,更多请关注php中文网其它相关文章!
编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号