Javascript 如何从承诺函数返回值

Javascript 如何从承诺函数返回值,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我有一个功能,可以检查设备是否在线。下面是代码 const ping=require('ping'); 导出功能查找设备(设备){ 试一试{ const hosts=[设备]; 设result=null; hosts.forEach((主机)=>{ ping.promise.probe(主机) 。然后((res)=>{ console.log(res.alive) 结果=res.alive; 返回{ 状态:结果 } }); }); }捕捉(错误){ 错误(err,“[config-findDev

我有一个功能,可以检查设备是否在线。下面是代码

const ping=require('ping');
导出功能查找设备(设备){
试一试{
const hosts=[设备];
设result=null;
hosts.forEach((主机)=>{
ping.promise.probe(主机)
。然后((res)=>{
console.log(res.alive)
结果=res.alive;
返回{
状态:结果
}
});
});
}捕捉(错误){
错误(err,“[config-findDevices()]”);
控制台错误(err);
返回{
状态:“失败”
}
}
}
我在redux操作中调用此函数,如下所示:

导出功能启动(设备){
返回调度=>{
const status=连接状态findDevices(设备);
退货({
类型:actionTypes.CONNECTIONSTATUS,
有效载荷:{
连接状态:状态
}
})
};
}

我期望状态变量为true或false。但是我得到了未定义的结果,即使我返回了promise函数中的值。我试着等待这个电话,但仍然不起作用。任何帮助都将不胜感激。谢谢。

如果是这样的话,你可以这样做

const getStatus = async () => {
  try {
    const hosts = [device];
    const promises = [];
    hosts.forEach((host) => {
      promises.push(ping.promise.probe(host));
    });
    const result = await Promise.all(promises);
    const status = result.map((r) => { return r.alive; });
    return status;
  } catch (err) {
    logger.error(err, '[ config - findDevices() ]');
    return { status: 'Failed' };
  }
};

不是100%确定所有变量都是什么,但是您是否考虑过使用
async/await
来简化类似的事情

const getStatus122 = async device => {
  return await Promise.all([device].map(ping.promise.probe))
      .then(({ alive }) => alive)
      .then(Status => ({ Status }))
      .catch(error => {
        logger.error(error, '[ config - findDevices() ]');
        return { Status: 'Failed' };
      })
}

这里有更多信息:

有了承诺,您应该在
when
catch
回调函数中检查承诺的结果。使用async/await,代码看起来可能会简单一些。这是一个明确承诺的版本

const ping = require('ping');
const Connectionstatus = {
  findDevices: (device) => {
    return ping.promise.probe(device).then((res) => {
      const result = res.alive;
      console.log(result);
      return {
        Status: result,
      };
    }).catch((err) => {
      logger.error(err, '[ config - findDevices() ]');
      console.error(err);
      return {
        Status: "failed"
      }
    });
  }
}
export function start(device) {
  return dispatch => {
    Connectionstatus.
    findDevices(device).
    then((status) => {
      dispatch({
        type: actionTypes.CONNECTIONSTATUS,
        payload: {
          ConnectionStatus: status
        }
      })
    });
  };
}

您可能会看到错误处理移动到了
catch
回调函数,而分派是在
then
回调函数中完成的。这就是您问题的答案。

您必须在
then()
块之外返回结果。这应该管用,我也试过了。它返回null;为什么在循环中调用承诺若有多个主机,我应该返回每个主机的状态。这就是为什么。您可能希望查看将
主机
数组映射到所有be承诺,并使用
Promise.all()
解析所有这些承诺。