在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 或并发控制库来管理多个请求,以及使用流来处理大数据量的传输。这些方法不仅能提高应用的性能,还能确保代码的可维护性和可读性。