新闻中心

使用J*aScript实现一个简单的任务队列_js异步编程

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

使用javascript实现一个简单的任务队列_js异步编程

在J*aScript中处理异步操作时,任务队列是一种常见的控制执行顺序的方式。尤其在需要按顺序执行多个异步任务、限制并发数量或实现重试机制时,一个简单的任务队列非常有用。下面是一个基于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,但不会超过两个任务同时运行。

动感购物HTML 动感购物HTML

修正了V1.10的一些BUG感购物HTML系统是集合目前网络所有购物系统为参考而开发,代码采用DIV编号,不管从速度还是安全我们都努力做到最好,此版虽为免费版但是功能齐全,无任何错误,特点有:专业的、全面的电子商务解决方案,使您可以轻松实现网上销售;自助式开放性的数据平台,为您提供充满个性化的设计空间;功能全面、操作简单的远程管理系统,让您在家中也可实现正常销售管理;严谨实用的全新商品数据库,便于

动感购物HTML 0 查看详情 动感购物HTML

扩展功能建议

这个基础版本可以进一步增强:

  • 支持取消任务:在 push 时返回一个取消方法,从队列中移除未执行的任务。
  • 错误重试机制:捕获失败任务并根据配置自动重试。
  • 优先级队列:为任务添加优先级,高优先级任务先执行。
  • 暂停/恢复:提供 pause() 和 resume() 方法控制队列运行状态。

基本上就这些。通过封装任务调度逻辑,我们可以更好地控制异步流程,避免资源竞争或过多并发请求带来的问题。这种模式在爬虫、批量上传、定时任务等场景中非常实用。

以上就是使用J*aScript实现一个简单的任务队列_js异步编程的详细内容,更多请关注其它相关文章!


# 都是  # 网站推广三种效率  # 美团营销与推广多少钱  # 百度竞价关键词排名成本  # 安丘seo优化推广  # seo文章质量怎么看  # 随州矩阵及seo  # 洛阳seo优化设计  # 宁波网站建设方案  # 关键词网站建设费用排名  # 节能网站建设美丽文案  # 上传  # 有何区别  # javascript  # 搜索功能  # 如何实现  # 多个  # 重试  # 有哪些  # 是一个  # 如何用  # 并发请求  # 异步任务  # 爬虫  # js  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 精准捕获:如何在页面中监听除特定元素外的所有点击事件  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  VS Code远程开发时如何处理文件权限问题  必由学官方网站入口 必由学学生教师共用登录通道  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  b站怎么删除评论_b站评论管理与删除操作  Lar*el DB::listen 事件中的查询执行时间单位解析  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  如何使用Node.js csv 包按条件移除含空字段的CSV记录  如何在 Excel Online 和 Google 表格中更改日期格式  html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  J*aScript中高效管理与清空动态列表:避免循环陷阱  Lar*el Form Request中唯一性验证在更新操作中的正确实现  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  Pyrogram与g4f集成:异步编程实践与常见错误解决  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  内存疯狂猛猛涨价:主板销量直接腰斩!  Lar*el递归关系中排除子孙节点的策略  如何在Promise链中优雅地中断后续then执行  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧  微信客户端如何收红包_微信客户端接收红包使用教程  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】  深入理解与实现最大堆的Heapify过程:常见错误与修正  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  age动漫网站入口 age动漫官网直接访问入口  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  AO3访问入口汇总 AO3网页版同人作品一键直达  J*a递归快速排序中静态变量导致数据累积问题的解决方案  cad如何更改注释性对象的比例_cad注释性比例调整方法  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  解决Rails应用中内容错位与Turbo警告:meta标签误用导致富文本渲染异常  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  React/Next.js中实现列表项的动态移动与状态管理:兼论唯一键的重要性  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException  解决Python单元测试中Mock异常方法调用计数为零的问题 

搜索