当前位置:首页 > JavaScript

JS实现并发请求

2026-03-15 20:55:43JavaScript

使用 Promise.all 实现并发请求

Promise.all 方法可以接收一个 Promise 数组作为参数,并返回一个新的 Promise。当所有传入的 Promise 都成功完成时,返回的 Promise 才会成功完成,结果是一个包含所有 Promise 结果的数组。

const urls = ['url1', 'url2', 'url3'];
const requests = urls.map(url => fetch(url));

Promise.all(requests)
  .then(responses => Promise.all(responses.map(res => res.json())))
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

使用 Promise.allSettled 处理部分失败

Promise.allSettled 方法会在所有给定的 Promise 都完成(无论是成功还是失败)后返回结果,适合需要处理部分请求失败的情况。

const urls = ['url1', 'url2', 'url3'];
const requests = urls.map(url => fetch(url).catch(e => e));

Promise.allSettled(requests)
  .then(results => {
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        console.log('Success:', result.value);
      } else {
        console.log('Error:', result.reason);
      }
    });
  });

使用 async/await 语法简化代码

async/await 语法可以让并发请求的代码更加清晰易读。

async function fetchAll(urls) {
  try {
    const responses = await Promise.all(urls.map(url => fetch(url)));
    const data = await Promise.all(responses.map(res => res.json()));
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

fetchAll(['url1', 'url2', 'url3']);

限制并发数量的实现

当需要控制并发请求的数量时,可以使用以下方法。

async function limitedConcurrency(urls, limit) {
  const results = [];
  const executing = new Set();

  for (const url of urls) {
    const promise = fetch(url).then(res => res.json());
    results.push(promise);
    executing.add(promise);
    promise.finally(() => executing.delete(promise));

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

  return Promise.all(results);
}

limitedConcurrency(['url1', 'url2', 'url3'], 2)
  .then(data => console.log(data))
  .catch(error => console.error('Error:', error));

使用第三方库实现并发控制

一些第三方库如 p-limit 可以更方便地实现并发控制。

JS实现并发请求

import pLimit from 'p-limit';

const limit = pLimit(2); // 并发限制为2
const urls = ['url1', 'url2', 'url3'];

const run = async () => {
  const results = await Promise.all(
    urls.map(url => limit(() => fetch(url).then(res => res.json())))
  );
  console.log(results);
};

run().catch(console.error);

标签: JS
分享给朋友:

相关文章

JS如何调用react组件

JS如何调用react组件

调用React组件的常见方法 在JavaScript中调用React组件通常涉及以下几种场景和方式: 直接渲染组件 通过ReactDOM.render()方法将组件渲染到DOM节点: import…

JS如何实现左右滑动

JS如何实现左右滑动

实现左右滑动的方法 使用 touchstart、touchmove 和 touchend 事件监听触摸操作,计算滑动距离和方向。 let startX, moveX; element.addEve…

用JS实现冰墩墩

用JS实现冰墩墩

以下是用JavaScript绘制冰墩墩的几种实现方法,结合Canvas绘图和SVG路径数据: 使用Canvas绘制基础轮廓 const canvas = document.createElement…

JS节流和防抖的实现

JS节流和防抖的实现

节流(Throttle)的实现 节流是指在一定时间间隔内,函数最多执行一次。常用于限制高频事件的触发频率,如滚动事件、窗口调整等。 function throttle(func, delay) {…

JS实现一个并发函数

JS实现一个并发函数

实现并发控制的几种方法 在JavaScript中实现并发控制可以通过多种方式,以下是几种常见的方法: Promise.all 使用Promise.all可以并行执行多个异步任务,等待所有任务完成后再…

JS奇数实现

JS奇数实现

判断数字是否为奇数 在JavaScript中,可以通过取模运算符(%)来判断一个数字是否为奇数。奇数除以2的余数为1。 function isOdd(num) { return num %…