当前位置:首页 > 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实现日期滚动选择

实现日期滚动选择的基本思路 使用HTML、CSS和JavaScript创建一个日期滚动选择器,允许用户通过滚动选择年、月、日。核心是通过监听滚动事件,动态更新显示的值。 HTML结构 创建一个包含年…

实现 slice JS

实现 slice JS

实现 JavaScript 的 slice 方法 JavaScript 的 slice 方法用于从数组或字符串中提取一部分,返回一个新的数组或字符串,而不修改原始数据。以下是实现 slice 的核心逻…

JS奇数实现

JS奇数实现

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

JS实现勋章

JS实现勋章

实现动态勋章效果 使用CSS和JavaScript创建动态旋转勋章。HTML部分定义勋章容器,CSS设置样式和动画,JavaScript控制交互行为。 <div class="badg…