首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对所有列表(数组)项执行操作?

如何对所有列表(数组)项执行操作?
EN

Stack Overflow用户
提问于 2021-02-04 19:43:16
回答 1查看 51关注 0票数 1

我尝试创建简单的监控工具来ping配置文件中的所有服务。为所有项目同时运行ping命令。目前,我可以按索引ping单个元素,我如何才能为每个人执行此操作?

config/host.yml

代码语言:javascript
复制
    default:
      server:
        port: 3000
      hosts:
        type: 'CaP AC'
    development:
      hosts:
      type: 'CaP AC'
      model: 'RBcAPGi-5acD2nD'
      location: 'Office'
      list:
        - host: '10.10.10.10'
          user: 'admin'
          password: 'password'
          name: 'cap-1'
        - host: '10.10.4.5'
          user: 'admin'
          password: 'password'
          name: 'cap-2'

控制器/update.js

代码语言:javascript
复制
const Hosts = require('./hosts');
const Monitor = require('ping-monitor');

module.exports = {
  Ping: function (config) {
      return new Promise(function (resolve, reject) {
          config.hosts.list.forEach(cap => {
              let pong = new Monitor({
                  website: "http://"+config.host,
                  interval: 1,
                  config: {
                      intervalUnits: "seconds"
                  },
                  ignoreSSL: true
              })
              pong.on('up', function (res, state) {
                  console.log('Service up!');
              });

              pong.on('error', function (error, res) {
                  console.error(error);
              });
          })
      })

  }

控制器/hosts.js

代码语言:javascript
复制
var hosts = [];
module.exports = hosts;

index.js

代码语言:javascript
复制
const config = yaml_config.load(__dirname + '/config/host.yml');
const Update = require('./controllers/update');
const Hosts = require('./controllers/hosts');

Update.Ping(config).then(result => {
  result.forEach(cap => {
      console.log(cap +result)
  }).catch((err) => {
      console.log(err)
  });
})
EN

回答 1

Stack Overflow用户

发布于 2021-02-04 22:13:01

您可以将每个显示器包装在promise中,并在打印接收状态之前等待所有这些promise。下面是一些示例代码,它们应该会对您有所帮助:

代码语言:javascript
复制
module.exports = {
  Ping: function (config) {
        const monitorPromises = config.hosts.list.map(currConfig => {
            return new Promise((resolve) => {
                const currMonitor = new Monitor({
                    website: "http://" + currConfig.host,
                    interval: 1,
                    config: {
                        intervalUnits: "seconds"
                    },
                    ignoreSSL: true
                });
                currMonitor.on('up', function (res, state) {
                    resolve(`${res.website}:${res.port} is up.`);
                });

                currMonitor.on('down', function (res) {
                    resolve(`${res.website} is down!, statusMessage:  ${res.statusMessage}`);
                });

                currMonitor.on('stop', function (res, state) {
                    resolve(`${res.website} monitor has stopped.`);
                });

                currMonitor.on('error', function (error, res) {
                    resolve(error);
                });

                currMonitor.on('timeout', function (error, res) {
                    resolve(error);
                });
            });
        });
        console.log("done");
        return Promise.all(monitorPromises);
    }
};

然后,在调用方中,您可以执行以下操作:

代码语言:javascript
复制
Update.Ping(config).then(monitors => {
  monitors.forEach(result => {
      console.log(result);
  }).catch((err) => {
      console.log(err)
  });
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66044909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档