在Ubuntu下使用JavaScript處理并發請求,通常會借助Node.js及其生態系統中的庫。以下是幾種常見的方法和工具:
fetch APINode.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);
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);
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));
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);
當需要處理的并發請求數量較多時,為了避免對服務器造成過大壓力或被限流,可以使用第三方庫如 p-limit 或 async 來限制并發數。
使用 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('所有請求已完成');
});
對于需要處理大量數據或流式傳輸的請求,可以使用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提供了豐富的工具和庫來滿足不同的需求。根據具體的應用場景選擇合適的方法,例如使用 fetch 或 axios 進行HTTP請求,利用 Promise.all 或并發控制庫來管理多個請求,以及使用流來處理大數據量的傳輸。這些方法不僅能提高應用的性能,還能確保代碼的可維護性和可讀性。