我有一个从 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()
、Promises
、async/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/