You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js并行Ping任务同步返回结果遇PromisePending问题

解决Node.js异步Ping任务无法返回完整结果集的问题

你的核心问题是对async函数的返回值特性理解有误:所有async函数默认返回一个Promise对象,直接赋值const online = pingAll(allIPs)得到的必然是处于pending状态的Promise,必须通过await或者.then()来等待Promise完成并获取最终结果。

修正方案

1. 使用await调用(需在async上下文内)

如果你的调用代码在另一个async函数中,直接用await等待结果:

async function main() {
  const online = await pingAll(allIPs);
  console.log(online); // 此时输出的是完整的IP结果数组
}

main();

2. 使用.then()处理结果

如果无法在async上下文内调用,用Promise的.then()方法获取结果:

pingAll(allIPs).then(online => {
  console.log(online); // 这里拿到完整的结果集
});

优化原代码(可选)

原代码返回的数组会包含null值(对应ping不通的主机),可以在最后过滤掉这些无效值,让结果更简洁:

async function pingAll(ips) {
  const promises = ips.map(host => 
    ping.promise.probe(host, { timeout: 3 })
      .then(res => res.alive ? host : null)
  );
  
  const values = await Promise.all(promises);
  // 过滤掉null,只保留在线的IP
  return values.filter(ip => ip !== null);
}

关于控制台输出顺序的说明

你提到"结果输出在'outside'之前",这是不符合代码逻辑的——原代码中await Promise.all(promises)会等待所有ping任务完成后,才会执行后续的console.log(values)和console.log('outside'),所以正常顺序应该是先输出values,再输出'outside'。如果出现顺序颠倒,大概率是ping库内部有额外的控制台输出,和你的代码逻辑无关。

内容的提问来源于stack exchange,提问作者Andrew Rendon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:24:56