ubuntu

ubuntu下js如何处理并发请求

小樊
49
2025-08-19 19:56:21
栏目: 编程语言

在Ubuntu下使用JavaScript处理并发请求,通常会借助Node.js及其生态系统中的库。以下是几种常见的方法和工具:

1. 使用原生 fetch API

Node.js 从 v18 版本开始原生支持 fetch API,可以直接用于发送HTTP请求。

// 示例:并发发送多个GET请求
const urls = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  'https://api.example.com/data3'
];

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 fetching data:', error);
  }
}

fetchAll(urls);

2. 使用 axios

axios 是一个基于Promise的HTTP客户端,适用于浏览器和Node.js环境。

安装 axios:

npm install axios

使用示例:

const axios = require('axios');

const urls = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  'https://api.example.com/data3'
];

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

fetchAll(urls);

3. 使用 Promise.all 处理并发

无论使用哪种HTTP客户端,Promise.all 都是处理多个并发请求的常用方法。它接收一个Promise数组,并在所有Promise都成功后返回一个新的Promise。

const urls = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  'https://api.example.com/data3'
];

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

4. 使用 async/await 提高代码可读性

结合 async/await 可以使异步代码更加简洁和易读。

const axios = require('axios');

const urls = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  'https://api.example.com/data3'
];

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

fetchAll(urls);

5. 控制并发数量(避免过多的并发请求)

当需要处理的并发请求数量较多时,为了避免对服务器造成过大压力或被限流,可以使用第三方库如 p-limitasync 来限制并发数。

使用 p-limit:

npm install p-limit

示例:

const axios = require('axios');
const pLimit = require('p-limit');

const urls = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  // ...更多URL
];

const limit = pLimit(5); // 限制并发数为5

async function fetchWithLimit(urls, limit) {
  const requests = urls.map(url => limit(() => axios.get(url)));
  const responses = await Promise.all(requests);
  const data = responses.map(res => res.data);
  console.log(data);
}

fetchWithLimit(urls, limit);

使用 async 库的 queue:

npm install async

示例:

const axios = require('axios');
const Async = require('async');

const urls = [
  'https://api.example.com/data1',
  'https://api.example.com/data2',
  // ...更多URL
];

const queue = Async.queue(async (task, callback) => {
  try {
    const res = await axios.get(task.url);
    callback(null, res.data);
  } catch (error) {
    callback(error);
  }
}, 5); // 并发数为5

urls.forEach(url => queue.push({ url }));

queue.drain(() => {
  console.log('所有请求已完成');
});

6. 使用流(Streams)处理大数据量请求

对于需要处理大量数据或流式传输的请求,可以使用Node.js的流(Streams)来提高效率和减少内存占用。

const axios = require('axios');
const fs = require('fs');

const url = 'https://api.example.com/large-data';
const filePath = 'data.json';

axios({
  method: 'get',
  url: url,
  responseType: 'stream'
})
.then(response => {
  const writer = fs.createWriteStream(filePath);
  response.data.pipe(writer);
  return new Promise((resolve, reject) => {
    writer.on('finish', resolve);
    writer.on('error', reject);
  });
})
.then(() => {
  console.log('文件下载完成');
})
.catch(error => {
  console.error('下载出错:', error);
});

总结

在Ubuntu下使用JavaScript处理并发请求,Node.js提供了丰富的工具和库来满足不同的需求。根据具体的应用场景选择合适的方法,例如使用 fetchaxios 进行HTTP请求,利用 Promise.all 或并发控制库来管理多个请求,以及使用流来处理大数据量的传输。这些方法不仅能提高应用的性能,还能确保代码的可维护性和可读性。

0
看了该问题的人还看了