函数具有值但返回未定义

时间:2019-05-03 17:04:36

标签: javascript node.js socket.io return gpio

我只是在使用nodejs。我写了一个返回变量的函数。当我调用该函数时,即使通过我尝试返回的变量也有值,我也得到未定义的返回。

function getDistance() {
  var MICROSECDONDS_PER_CM = 1e6 / 34321;
  var trigger = new Gpio(23, { mode: Gpio.OUTPUT });
  var echo = new Gpio(18, { mode: Gpio.INPUT, alert: true });
  trigger.digitalWrite(0); // Make sure trigger is low
  var startTick;
  var prox;
  trigger.trigger(10, 1);
  echo.on('alert', (level, tick) => {
    if (level == 1) {
      startTick = tick;
    } else {
      var endTick = tick;
      var diff = (endTick >> 0) - (startTick >> 0); // Unsigned 32 bit arithmetic
      prox = diff / 2 / MICROSECDONDS_PER_CM;
      distance = prox;
      console.log(prox);
    }
  });
  return prox;
};

它不返回代理值吗? 当我打电话时,我得到“未定义的返回”

1 个答案:

答案 0 :(得分:1)

getDistance不能是同步函数,因为它必须等待'alert'事件来计算prox。一种替代方法是返回Promise,而不是立即得到答案:


function getDistance() {
  return new Promise((resolve, reject) => {
    var MICROSECDONDS_PER_CM = 1e6 / 34321;
    var trigger = new Gpio(23, { mode: Gpio.OUTPUT });
    var echo = new Gpio(18, { mode: Gpio.INPUT, alert: true });
    trigger.digitalWrite(0); // Make sure trigger is low
    var startTick;
    var prox;
    trigger.trigger(10, 1);

    echo.on('alert', (level, tick) => {
      if (level == 1) {
        startTick = tick;
      } else {
        var endTick = tick;
        var diff = (endTick >> 0) - (startTick >> 0); // Unsigned 32 bit arithmetic
        prox = diff / 2 / MICROSECDONDS_PER_CM;
        distance = prox;
        console.log(prox);
        resolve(prox);
      }
    });
  });
}

// Use it
getDistance().then(result => {
  // do stuff
});

// or with syntactic sugar
const result = await getDistance();