NodeJS Closure - 循环对象数组并使用来自每个对象的数据ping服务器

时间:2017-08-30 14:43:28

标签: javascript node.js closures

我有一个从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;
}

1 个答案:

答案 0 :(得分:2)

状态为undefined,因为您试图在同步循环中插入异步代码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);
     });