当前位置:首页 > JavaScript

js 实现异步队列

2026-04-04 18:26:55JavaScript

异步队列的实现方法

在JavaScript中,异步队列通常用于控制异步任务的执行顺序,确保任务按特定顺序或条件依次执行。以下是几种常见的实现方式:

使用Promise链式调用

通过Promise的链式调用特性,可以确保异步任务按顺序执行。每个任务完成后触发下一个任务。

function asyncQueue(tasks) {
  return tasks.reduce((promiseChain, currentTask) => {
    return promiseChain.then(chainResults => 
      currentTask().then(currentResult => 
        [...chainResults, currentResult]
      )
    );
  }, Promise.resolve([]));
}

基于async/await的实现

js 实现异步队列

利用async/await语法可以更直观地编写异步队列代码,保持代码的可读性。

async function asyncQueue(tasks) {
  const results = [];
  for (const task of tasks) {
    results.push(await task());
  }
  return results;
}

使用队列数据结构

js 实现异步队列

手动维护一个队列,通过递归或循环的方式依次处理队列中的任务。

class AsyncQueue {
  constructor() {
    this.queue = [];
    this.isProcessing = false;
  }

  enqueue(task) {
    this.queue.push(task);
    if (!this.isProcessing) this.process();
  }

  async process() {
    this.isProcessing = true;
    while (this.queue.length > 0) {
      const task = this.queue.shift();
      await task();
    }
    this.isProcessing = false;
  }
}

带并发控制的异步队列

限制同时执行的异步任务数量,避免资源过载。

async function asyncQueue(tasks, concurrency = 1) {
  const results = [];
  const executing = new Set();

  for (const task of tasks) {
    const p = task().then(res => {
      executing.delete(p);
      return res;
    });
    executing.add(p);
    results.push(p);

    if (executing.size >= concurrency) {
      await Promise.race(executing);
    }
  }

  return Promise.all(results);
}

注意事项

  • 错误处理:需要为每个任务添加catch处理,避免单个任务失败导致整个队列中断
  • 内存管理:长时间运行的队列需注意内存泄漏问题
  • 取消机制:实现任务取消功能时需清除队列中未执行的任务

以上方法可根据具体需求选择使用,Promise链式调用适合简单场景,async/await代码更易读,队列类实现更灵活,并发控制适用于资源敏感场景。

标签: 队列js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…

js实现乘法

js实现乘法

实现乘法运算的方法 在JavaScript中实现乘法运算可以通过多种方式完成,以下列举几种常见方法: 基础运算符 直接使用乘法运算符*是最简单的方式: let result = 3 * 5; //…