登录
首页 >  文章 >  前端

JavaScript异步队列实现全解析

时间:2026-01-03 10:00:56 313浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《JavaScript异步任务队列实现详解》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

任务队列可控制异步执行顺序与并发数,提升稳定性;示例中TaskQueue类限制2个并发任务,按序执行5个延时请求,支持扩展优先级和重试机制。

使用JS实现一个任务队列_javascript异步

在 JavaScript 中,任务队列常用于管理异步任务的执行顺序,比如多个 API 请求、定时操作或资源加载。通过控制任务的并发数量和执行时机,可以避免资源竞争或服务器压力过大。下面是一个简单但实用的异步任务队列实现。

基本结构:任务队列类

我们创建一个 TaskQueue 类,支持添加异步任务,并控制最大并发数。

class TaskQueue {
  constructor(concurrency = 1) {
    this.concurrency = concurrency;
    this.running = 0;
    this.queue = [];
  }

  add(task) {
    return new Promise((resolve, reject) => {
      this.queue.push({ task, resolve, reject });
      this.next();
    });
  }

  next() {
    if (this.running >= this.concurrency || this.queue.length === 0) return;
    const { task, resolve, reject } = this.queue.shift();
    this.running++;
    task()
      .then(resolve, reject)
      .finally(() => {
        this.running--;
        this.next();
      });
  }
}

使用示例:模拟异步请求

假设我们要按顺序发起多个延时请求,限制同时最多运行两个任务。

const queue = new TaskQueue(2);

function createTask(id, delay) {
  return () =>
    new Promise((resolve) => {
      console.log(`任务 ${id} 开始执行`);
      setTimeout(() => {
        console.log(`任务 ${id} 完成`);
        resolve(id);
      }, delay);
    });
}

queue.add(() => createTask(1, 1000)());
queue.add(() => createTask(2, 500)());
queue.add(() => createTask(3, 800)());
queue.add(() => createTask(4, 300)());
queue.add(() => createTask(5, 600)());

输出结果会显示任务按并发上限逐步执行,不会一次性全部启动。

扩展功能:支持优先级或重试机制

你可以增强队列功能,例如为任务添加优先级字段,使用 sort() 调整执行顺序;或者在 catch 中实现自动重试逻辑。

比如修改 add 方法支持优先级:

add(task, priority = 0) {
  return new Promise((resolve, reject) => {
    this.queue.push({ task, resolve, reject, priority });
    this.queue.sort((a, b) => b.priority - a.priority); // 高优先级先执行
    this.next();
  });
}

这样可以根据业务需求动态调整任务执行顺序。

基本上就这些。这个任务队列轻量且可扩展,适用于控制异步操作的节奏,提升应用稳定性。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>