Node.js 尝试在NodeJs中调用函数时发生回调错误

Node.js 尝试在NodeJs中调用函数时发生回调错误,node.js,websocket,raspberry-pi,distance,arduino-ultra-sonic,Node.js,Websocket,Raspberry Pi,Distance,Arduino Ultra Sonic,我试图通过web套接字控制一个树莓pi。我发现了一个类似的项目,并一直围绕它构建我的项目。除了一个距离传感器,我已经设法使所有的东西都工作了 tank.getDistance = function () { async.parallel([ gpio.write(trig,0), gpio.write(trig,1), gpio.write(trig,0), ]); var start,stop; while(gpio.read(echo) == 0){

我试图通过web套接字控制一个树莓pi。我发现了一个类似的项目,并一直围绕它构建我的项目。除了一个距离传感器,我已经设法使所有的东西都工作了

tank.getDistance = function () {
   async.parallel([
    gpio.write(trig,0),
    gpio.write(trig,1),
    gpio.write(trig,0),
  ]);
  var start,stop;
  while(gpio.read(echo) == 0){start = Date.now();}
  while(gpio.read(echo) == 1){stop = Date.now();}
  var distance = ((stop-start)/1000.0)*17000
  console.log("distance: "+ distance);
};
这就是我试图读取超声波传感器的方式。我已经在python中测试了这个逻辑,它在那里工作

socket.on('keydown', function (dir) {
    switch (dir) {
      case 'up':
        tank.moveForward();
        console.log("forward");
        tank.getDistance();
        break;
...
这就是我调用函数的地方。但是每次我调用这个函数,我都会得到一个

/home/pi/marinaBot/marinaBot/node_modules/rpi-gpio/rpi-gpio.js:286
            throw new Error('A callback must be provided')
            ^
Error: A callback must be provided
    at Gpio.read.input (/home/pi/marinaBot/marinaBot/node_modules/rpi-gpio/rpi-gpio.js:286:19)
    at Object.tank.getDistance (/home/pi/marinaBot/marinaBot/app.js:78:14)
我不知道为什么会发生这种情况,因为我没有归还任何东西。我曾尝试使用其他超声波库,如“r-pi-usonic”,但我不了解它的设置。 有什么想法吗? 刚刚开始学习NodeJS。这可能真的很简单

gpio.read(echo, callbackfunction(error, data){})
请检查这份文件


您需要
async/await
函数来执行
while

var gpio = require('rpi-gpio')

var gpio_read = function (channel) {
    return new Promise(resolve => {
        gpio.read(channel, function (error, result) {
            console.log('gpio.read', error, result);
            resolve(result);
        });
    });
}

var echo = 16;

var calculateDistance = async function () {
    var start, stop;

    while (await gpio_read(echo) == false) { start = Date.now(); }
    while (await gpio_read(echo) == true) { stop = Date.now(); }
    var distance = ((stop - start) / 1000.0) * 17000
    console.log("distance: " + distance);
}

gpiop.setup(echo, gpio.DIR_IN)
    .then(function () {
        calculateDistance();
    })
    .catch((err) => {
        console.log('Error: ', err.toString())
    })
更新内容:
1.使用
async
as创建
calculateInstance
函数

  var calculateDistance = async function () { ... }
  • 返回新承诺

  • parallel(items,cb)-期望您发送一个回调作为第二个参数,所有的逻辑也应该在那里完成,或者如果您不喜欢回调方法,您可以切换到承诺它在末尾更干净我如何编写回调函数。在文档中,write也需要回调,但在我的情况下,它不需要回调就可以工作。当然,write函数不需要回调也可以工作,因为我们可以忽略wrte successThank,但我不确定如何将所有内容链接起来?gpio.read null false是我使用修改过的编解码器时遇到的错误。你能帮我吗?