当前位置:首页 > JavaScript

JS实现并发请求

2026-02-02 20:34:01JavaScript

使用Promise.all实现并发请求

Promise.all可以同时发起多个异步请求,并在所有请求完成后统一处理结果。该方法适用于需要同时获取多个独立数据的场景。

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));

限制并发数量的实现

当需要控制同时进行的请求数量时,可以使用以下方法。这种方式适合避免服务器过载或浏览器限制的情况。

async function concurrentRequests(urls, maxConcurrent) {
  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 >= maxConcurrent) {
      await Promise.race(executing);
    }
  }

  return Promise.all(results);
}

// 使用示例
concurrentRequests(['url1', 'url2', 'url3'], 2)
  .then(data => console.log(data));

使用async/await的并发处理

结合async/await语法可以更清晰地编写并发请求代码。这种方式代码可读性更好,适合现代JavaScript开发。

async function fetchAllUrls(urls) {
  try {
    const responses = await Promise.all(
      urls.map(url => fetch(url).then(res => res.json()))
    );
    console.log(responses);
  } catch (error) {
    console.error('请求出错:', error);
  }
}

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

处理失败请求的策略

在实际应用中,可能需要处理部分请求失败的情况,而不是全部失败。以下方法允许部分请求失败而不影响其他请求。

async function fetchWithFallback(urls) {
  const results = await Promise.allSettled(
    urls.map(url => fetch(url).then(res => res.json()))
  );

  const successful = results
    .filter(result => result.status === 'fulfilled')
    .map(result => result.value);

  const failed = results
    .filter(result => result.status === 'rejected')
    .map(result => result.reason);

  console.log('成功:', successful);
  console.log('失败:', failed);
}

使用AbortController取消请求

在需要取消请求的场景下,可以使用AbortController来中止正在进行的请求。这对于用户主动取消或超时处理很有用。

const controller = new AbortController();
const { signal } = controller;

// 设置超时自动取消
const timeoutId = setTimeout(() => controller.abort(), 5000);

fetch('url', { signal })
  .then(res => res.json())
  .then(data => {
    clearTimeout(timeoutId);
    console.log(data);
  })
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('请求被取消');
    } else {
      console.error('请求出错:', err);
    }
  });

JS实现并发请求

标签: JS
分享给朋友:

相关文章

JS如何调用react组件

JS如何调用react组件

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

JS如何实现左右滑动

JS如何实现左右滑动

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

JS实现日期滚动选择

JS实现日期滚动选择

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

JS实现文本的删除

JS实现文本的删除

使用 substring() 方法 通过指定起始和结束索引截取字符串的一部分,间接实现删除效果。 let str = "Hello World"; let newStr = str.substr…

JS能实现跨平台吗

JS能实现跨平台吗

JavaScript 的跨平台能力 JavaScript 是一种高度灵活的脚本语言,通过不同运行时环境和工具链可以实现跨平台开发。以下是其跨平台能力的核心实现方式: 浏览器环境 JavaScri…

用JS实现冰墩墩

用JS实现冰墩墩

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