我有一个从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;
}
答案 0 :(得分:2)
状态为undefined
,因为您试图在同步循环中插入异步代码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);
});