Javascript 函数返回未定义的值,尽管它有值

Javascript 函数返回未定义的值,尽管它有值,javascript,node.js,socket.io,return,gpio,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.

我只是在用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;
};
它不应该返回prox值吗?
当我打电话时,我得到“undefined returned”(未定义返回)

getDistance
不能是同步函数,因为它必须等待“警报”事件来计算
prox
。另一种选择是返回a,而不是立即回答:


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();



你点了一个比萨饼,挂了电话,然后你试着吃它。。。。欢迎来到异步编程的世界。代码不会神奇地坐在那里等待
echo.on('alert'
执行。我能让它不异步吗?@epascarello。比如有什么方法可以让它成为一个阻塞方法吗?这就是回调的目的。另请参阅我的帖子:所以我从你发布的线程中挖掘了一些东西,似乎等待在我的情况下不起作用,但结果是完美的。非常感谢。