当前位置:首页 > 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));

限制并发数量的实现

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

JS实现并发请求

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开发。

JS实现并发请求

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实现日期滚动选择

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

实现 slice JS

实现 slice JS

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

JS实现取色

JS实现取色

使用 input[type="color"] 获取颜色值 HTML5 提供了原生颜色选择器,通过 <input type="color"> 可直接调用系统取色工具。用户选择的颜色会以十六进…

JS实现小手状

JS实现小手状

使用CSS cursor属性实现小手状 在网页中实现鼠标悬停时显示小手形状,最简单的方法是使用CSS的cursor属性。该属性可以直接设置为pointer,浏览器会自动渲染为手型图标。 .click…

JS拖拽的实现

JS拖拽的实现

基本拖拽实现 使用原生JavaScript实现拖拽功能需要监听三个事件:mousedown、mousemove和mouseup。在mousedown事件中记录初始位置,在mousemove事件中计算偏…