Javascript 节点-提示包含循环的函数

Javascript 节点-提示包含循环的函数,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我正在使用一个名为npm的包,它返回一个网络地址列表 在简短的文档中,arp.table()方法如下所示: arp.table(function(err, entry) { //console.log(entry) - 'entry' is an object like {ip: 192.168.0.1, mac: ff:ff:ff:ff:ff} } arp_table = [] arp.table(function(err, entry) { arp_array.push(entry

我正在使用一个名为npm的包,它返回一个网络地址列表

在简短的文档中,
arp.table()
方法如下所示:

arp.table(function(err, entry) {
  //console.log(entry) - 'entry' is an object like {ip: 192.168.0.1, mac: ff:ff:ff:ff:ff}
}
arp_table = []
arp.table(function(err, entry) {
  arp_array.push(entry)
}
const p = new Promise((resolve, reject) => {
    const arp_array = [];
    arp.table(function(err, entry) {
      if (err) 
        reject(err);
      if (entry)
        arp_array.push(entry)
      else
        resolve(arp_array);
    });
});
arp.table()
方法显然包含一个循环,并逐个对象返回arp表对象,而不是返回对象数组

我可以返回如下数组:

arp.table(function(err, entry) {
  //console.log(entry) - 'entry' is an object like {ip: 192.168.0.1, mac: ff:ff:ff:ff:ff}
}
arp_table = []
arp.table(function(err, entry) {
  arp_array.push(entry)
}
const p = new Promise((resolve, reject) => {
    const arp_array = [];
    arp.table(function(err, entry) {
      if (err) 
        reject(err);
      if (entry)
        arp_array.push(entry)
      else
        resolve(arp_array);
    });
});
但是我怎样才能“等待”数组(这样我才能
.map()
它)

我曾尝试使用
util.promisify
arp.table()
方法进行“promisify”,但它只会迭代一次:

// THIS DOES NOT WORK
const util = require("util");
const arp_table = util.promisify(arp.table);
arp_table()
.then(r => console.log(x))
我还尝试将
arp.table()
方法放入带有承诺的函数中,但这也不起作用-在表循环完成之前返回数组:

// THIS DOES NOT WORK, EITHER
const arp_table = function() {
  var arp_array = [];
  return new Promise(resolve => {
    arp.table((err, entry) => {
      arp_array.push(entry);
    });
    resolve(arp_array);
  });
};

arp_table()
.then(r => console.log(x))

我已经在SO上查看了循环的其他模式,但是,在本例中,
arp.table()
本质上是一个“黑盒子”,我不确定如何最好地显示其输出查看源代码,回调在循环中被调用,但在循环以
条目
作为
null
结束后也会被调用

因此,您可以使用条件来解决承诺:

const arp_table = function() {
  var arp_array = [];
  return new Promise((resolve, reject) => {
    arp.table((err, entry) => {
      if(err){
        reject(err);
      }
      if (entry) {
        arp_array.push(entry);
      } else {
        resolve(arp_array);
      }
    });

  });
};

arp_table()
  .then(r => console.log(x))

查看源代码,回调在循环中被调用,但在循环以
entry
as
null
结尾后也会被调用

因此,您可以使用条件来解决承诺:

const arp_table = function() {
  var arp_array = [];
  return new Promise((resolve, reject) => {
    arp.table((err, entry) => {
      if(err){
        reject(err);
      }
      if (entry) {
        arp_array.push(entry);
      } else {
        resolve(arp_array);
      }
    });

  });
};

arp_table()
  .then(r => console.log(x))

当第二个参数的
entry
设置为
null
时,此特定库会在循环完成后调用您的回调,因此您可以创建一个
Promise
,如下所示:

arp.table(function(err, entry) {
  //console.log(entry) - 'entry' is an object like {ip: 192.168.0.1, mac: ff:ff:ff:ff:ff}
}
arp_table = []
arp.table(function(err, entry) {
  arp_array.push(entry)
}
const p = new Promise((resolve, reject) => {
    const arp_array = [];
    arp.table(function(err, entry) {
      if (err) 
        reject(err);
      if (entry)
        arp_array.push(entry)
      else
        resolve(arp_array);
    });
});

当第二个参数的
entry
设置为
null
时,此特定库会在循环完成后调用您的回调,因此您可以创建一个
Promise
,如下所示:

arp.table(function(err, entry) {
  //console.log(entry) - 'entry' is an object like {ip: 192.168.0.1, mac: ff:ff:ff:ff:ff}
}
arp_table = []
arp.table(function(err, entry) {
  arp_array.push(entry)
}
const p = new Promise((resolve, reject) => {
    const arp_array = [];
    arp.table(function(err, entry) {
      if (err) 
        reject(err);
      if (entry)
        arp_array.push(entry)
      else
        resolve(arp_array);
    });
});


arp.table()
在这种情况下,没有机制在循环终止时通知调用者?似乎就是这样,这意味着你所要求的是不可能的。要么是这个包的创建者设计的API很糟糕,要么是这个方法的目的是无限循环(没有取消,所以这仍然是糟糕的API设计)。据我所知不是这样的-一个人需要知道表上有多少条目的,这在大多数情况下是不可知的。然后我会说这是不可行的。您必须知道有多少个表(然后可以计算正在进行的回调的数量),或者lib必须提供一种机制,在回调完成时通知您。没关系,当回调循环完成时,库使用
null
调用回调。
arp.table()
在这种情况下,没有机制在循环终止时通知调用者?似乎就是这样,这意味着你所要求的是不可能的。要么是这个包的创建者设计的API很糟糕,要么是这个方法的目的是无限循环(没有取消,所以这仍然是糟糕的API设计)。据我所知不是这样的-一个人需要知道表上有多少条目的,这在大多数情况下是不可知的。然后我会说这是不可行的。您必须知道有多少个表(然后您可以计算正在进行的回调的数量),或者lib必须提供一种机制,在完成时通知您。没关系,循环完成后,库使用
null
调用回调。编辑:修复了不一致的变量名和错误的
Promise
构造函数签名,添加了错误处理完美地回答了这个问题,比@charlietfl提前了几秒,谁提供了一个几乎相同的解决方案编辑:修复了不一致的变量名和错误的
Promise
constructor签名,添加了错误处理完美地回答了问题-比@charlietfl早几秒,谁提供了一个几乎相同的解决方案完美地回答了问题-只比@laptou晚几秒,因此,我实际上比其他人早一点接受了他们的回答……但并没有劈头盖脸的道歉——不知何故,其他人的回答首先出现了。无论如何,感谢你及时、出色的回答。完美地回答了这个问题——而且只比@laptou晚了几秒钟,因此我实际上比另一个提前接受了他的回答……但不是劈头盖脸的道歉——不知怎的,另一个回答最先出现了。无论如何,感谢您及时、出色的回复。