gpt4 book ai didi

node.js - NodeJS 异步 - 即使某些请求失败也继续执行多个 http 请求

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

我正在尝试发出多个 HTTP 请求并累积,使用以下代码在 NodeJS 中显示结果:

const async = require('async');
const request = require('request');

function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function(err, res, body) {
console.log("invoked")
callback(err, body);
}
).on('error', function(err) {
console.log(err)
});
}

const urls= [
"http://1.2.3.4:30500/status/health/summary",
"http://5.6.7.8:30505/status/health/summary"
];

async.map(urls, httpGet, function (err, res){
if (err)
console.log(err);
else
console.log(res);
});

这里的问题是,如果第一个请求( http://1.2.3.4:30500/status/health/summary )失败(例如连接被拒绝等),则第二个请求不会通过。我知道我犯了一个愚蠢的错误,但找不到它。任何帮助表示赞赏!

最佳答案

在 async.map 中,如果其中一个调用将错误传递给其回调,则立即调用主回调(对于 map 函数)并返回错误(这就是您的情况的问题)。为了不在出现第一个错误时终止,请勿在 httpGet 中使用 err 参数调用回调。

使用 async every,它接收一个参数列表和一个函数,并使用每个元素调用该函数,确保在你的 httpGet 里面出错时调用回调,没有错误,这将使其余的调用即使某些调用出现错误,也可以继续。这也适用于map,但是,我认为更适合您的情况的函数是async.each,而不是map,您还可以使用eachLimit方法限制并发调用的数量。

检查https://caolan.github.io/async/docs.html#each

const async = require('async');
const request = require('request');

function httpGet(url, callback) {
const options = {
url : url,
json : true
};
request(options,
function(err, res, body) {
if (err){
console.log(err);
callback();
return;
}
console.log("invoked")
callback(null, body);
}
).on('error', function(err) {
console.log(err);
callback();
});
}

const urls= [
"http://1.2.3.4:30500/status/health/summary",
"http://5.6.7.8:30505/status/health/summary"
];

async.each(urls, httpGet, function (err, res) {
}, function (err, res) {

});

关于node.js - NodeJS 异步 - 即使某些请求失败也继续执行多个 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44940805/

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