按顺序执行功能

时间:2018-11-20 16:43:27

标签: javascript node.js

基本上,我正在制作一个小脚本,以根据某些服务器的主机名检查IP,然后将该IP与基于路由器发出的IP块的列表进行比较。

我遇到的问题显然是异步执行代码,它可能被回答了一千遍,但是我似乎无法全神贯注于如何解决它。我曾尝试将所有内容都包装在Promise中,但最终却破坏了所有内容。这是将我需要的步骤分解为各个功能的最新尝试。

const dns = require('dns');
const Table = require('cli-table');
const hosts = ['Server01', 'Server02', 'Server03'];
let list = [];

table = new Table({
    head: ['Host', 'Location']
    , colWidths: [20, 30]
});

function process() {
    hosts.forEach(host => {
        dns.lookup(host, function (err, result) {
            ipSplit = result.split(".");
            r = ipSplit[0] + '.' + ipSplit[1] + '.' + ipSplit[2];
            if (r == '10.23.13') {
                list.push([host, 'Lab A112']);
            }
            else {
                list.push([host, 'Unknown']);
            }
        });
    });
};

function build () {
    table.push(list);
};

function push () {
    console.log(table.toString());
};

process();
build();
push();

我在这里错过了什么难题?

2 个答案:

答案 0 :(得分:0)

您将要使用Promise.all

const result = Promise.all(hosts.map(host => {
  return new Promise((resolve, reject) => {
    dns.lookup(host, function (err, result) {
      if (err) reject(err);
      const ipSplit = result.split(".");
      const r = ipSplit[0] + '.' + ipSplit[1] + '.' + ipSplit[2];
      if (r === '10.23.13') {
        resolve([host, 'Lab A112']);
      } else {
        resolve([host, 'Unknown']);
      }
    });
  }
}));

答案 1 :(得分:0)

您可以使用 async / await 来订购函数调用,您将获得所需的订单。

java.lang.String