gpt4 book ai didi

node.js - 使用 NodeJS 异步调用多个 API,无论每个 API 的结果如何

转载 作者:太空宇宙 更新时间:2023-11-03 22:20:52 26 4
gpt4 key购买 nike

我尝试使用 NodeJS 调用多个端点,它给出了结果,但问题是它在所有请求都得到 200 或一些有效的 HTTP 响应之后给出了结果。我想要做的是获得所有结果,而不考虑其他 API。例如,如果我调用 3 个端点,即A、B、C。如果端点 B 由于服务器问题而延迟响应,我的代码不应等待 B 完成请求并发送其他已完成请求的响应。

我正在使用异步 promise ,但它没有给出所需的输出。当最慢的 API 请求完成时,它会打印所有结果。

const request = require('request');

var requestAsync = function(url) {
return new Promise((resolve, reject) => {
var req = request(url, (err, response, body) => {
if (err) return reject(err, response, body);
resolve(JSON.parse(body));
});
});
};

const urls = [
'https://jsonplaceholder.typicode.com/posts',
'https://jsonplaceholder.typicode.com/albums',
'https://jsonplaceholder.typicode.com/users',
'http://localhost/local/node/1.php',
];


var getParallel = async function() {
//transform requests into Promises, await all
try {
var data = await Promise.all(urls.map(requestAsync));
} catch (err) {
console.error(err);
}
console.log(data);
}

getParallel();

最佳答案

使用 Promise.race 确保返回的 Promise 在不超过指定时间段后解析(或拒绝)。例如,下面的代码将确保 Promise.all 在 3000 毫秒后解析或拒绝:

var requestAsync = function(url) {
return Promise.race([
new Promise(resolve => setTimeout(resolve, 3000, 'too slow')),
new Promise((resolve, reject) => {
var req = request(url, (err, response, body) => {
if (err) return reject(err, response, body);
resolve(JSON.parse(body));
});
})
]);
};

如果您想拒绝任何花费太长时间的情况,只需将 reject 传递到 setTimeout 而不是 resolve (其中 rejectnew Promise 回调的第二个参数)。

关于node.js - 使用 NodeJS 异步调用多个 API,无论每个 API 的结果如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55438790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com