溫馨提示×

ubuntu下js如何處理并發請求

小樊
48
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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女