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

标签 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;
}

最佳答案

状态为未定义,因为您尝试在同步循环内插入异步代码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/

相关文章:

javascript - 如何创建小型 Javascript 扩展语言?

使用闭包在循环中创建的javascript计时器或间隔

javascript - 说明为什么我的 JS 闭包没有正确返回?

javascript - jQuery,如何正确查找 HTML 中父元素的元素类型

Javascript 对象问题

javascript - 查看套接字是否等于 null

javascript - NodeJS 和 EJS 的 JSON 字符串化问题

javascript - 如何在 React 中保存文件对象到状态?

javascript - Grunt,将 html 文件复制到构建时的脚本文件夹

node.js - 我不能同时使用 $set 运算符和 $inc 运算符,只有一个在我的情况下有效