如何从承诺函数返回值

时间:2019-12-04 06:29:44

标签: javascript node.js promise async-await

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

const ping = require('ping');
export function findDevices(device) {
  try {
    const hosts = [device];
    let result = null;
    hosts.forEach((host) => {
      ping.promise.probe(host)
        .then((res) => {
          console.log(res.alive)
          result = res.alive;
          return {
            Status: result
          }
        });
    });
  } catch (err) {
    logger.error(err, '[ config - findDevices() ]');
    console.error(err);
    return {
      Status: "Failed"
    }
  }
}

我正在像这样的redux动作中调用此函数:

export function start(device) {
  return dispatch => {
    const status = Connectionstatus.findDevices(device);
    return dispatch({
      type: actionTypes.CONNECTIONSTATUS,
      payload: {
        ConnectionStatus: status
      }
    })
  };
}

我希望状态变量为true或false。但是,即使我在promise函数中返回值,我也变得不确定。我尝试等待此呼叫,但仍然无法正常工作。任何帮助将非常感激。谢谢。

3 个答案:

答案 0 :(得分:0)

如果是这种情况,您可以这样做

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' };
  }
};

答案 1 :(得分:0)

不是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' };
      })
}

此处的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

答案 2 :(得分:0)

对于Promises,您应该在whencatch回调函数中检查承诺的结果。使用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回调函数。这就是您问题的答案。