gpt4 book ai didi

javascript - NodeJS 闭包 - 循环对象数组并使用每个对象的数据 Ping 服务器

转载 作者:行者123 更新时间:2023-12-01 03:09:13 25 4
gpt4 key购买 nike

我有一个从 JSON 文件读取的服务器 JSON 对象列表。

我循环遍历每个服务器对象,从该对象中获取一个值并将其与一个字符串连接起来以创建一个 URL。然后我使用 URL 发出 get 请求来检查服务器是否已启动。 get请求的结果应该设置每个服务器对象的状态。

问题是,每次循环时,服务器对象中的值都显示为未定义。我似乎无法弄清楚我的关闭问题出在哪里。

var servers = require('./data/servers.json');
var ping = require('http');

var newServers = statusChecker(servers);

function statusChecker(servers) {
var i;
for(i=0;i<servers.length;i++) {
servers[i]['status'] = function(j) {
return function () {
var proto = 'http://'
var server = servers[i].servername;
var healthEndPoint = '/health-end-point';
var url = proto+server+healthEndPoint;
//This logs the url with the server part undefined
console.log(url);
ping.get(url, function(res){
console.log(res);
return true;
}).on('error', function(e){
return false;
});
}()
}(i);
}
return servers;
}

最佳答案

状态为未定义,因为您尝试在同步循环内插入异步代码ping.get

您想了解一下 Promise.all()Promisesasync/await

<小时/>

这是一个用于执行 ping 操作的函数示例

 function asynchronousPing(oneServer) {
return new Promise((resolve, reject) => {
const proto = 'http://'
const server = oneServer.servername;
const healthEndPoint = '/health-end-point';
const url = proto + server + healthEndPoint;

ping.get(url, function (res) {
resolve(true);
}).on('error', function (e) {
resolve(false);
});
});
}
<小时/>

这就是你如何调用它

  Promise.all(servers.map(x => asynchronousPing(x)))
.then((allStatus) => {
console.log(allStatus);
})
.catch((err) => {
console.log(err);
});

关于javascript - NodeJS 闭包 - 循环对象数组并使用每个对象的数据 Ping 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963419/

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