2017-01-30 6 views
1

Я довольно новичок с nodejs, поэтому, пожалуйста, не позволяйте ненависти течь через вас, если я задаю простые вопросы.Node.js async parallel TypeError: задача не является функцией на малине pi

Я пытаюсь использовать nodejs на малине pi 3 для управления двумя моторами. Я получаю async задачу не является функцией ошибки. Я искал ответ, но ни один из них, который я нашел, не работал для меня. Я мог бы использовать руку с этим.

Ниже приведен код: The error

var express = require('express'), 
http = require('http'), 
path = require('path'), 
async = require("async"), 
rpio = require('rpio'), 
app = express(); 

app.set('port', 3000); 

app.use(express.static(path.join(__dirname, '/static'))); 

var http = http.createServer(app).listen(app.get('port'), function() { 
    console.log('Serverul started on port ' + app.get('port')); 
}); 

var io = require('socket.io')(http); 

var tank = { 
    motors: { 
     leftFront: 11, 
     leftBack: 12, 
     rightFront: 13, 
     rightBack: 15 
    }, 
    init: function() { 
     rpio.open(this.motors.leftFront, rpio.OUTPUT); 
     rpio.open(this.motors.leftBack, rpio.OUTPUT); 
     rpio.open(this.motors.rightFront, rpio.OUTPUT); 
     rpio.open(this.motors.rightBack, rpio.OUTPUT); 
    }, 
    moveForward: function() { 
     async.parallel([ 
      rpio.write(this.motors.leftFront, rpio.HIGH), 
      rpio.write(this.motors.rightFront, rpio.HIGH) 
     ]); 
    }, 
    moveBackward: function() { 
     async.parallel([ 
      gpio.write(this.motors.leftBack, 1), 
      gpio.write(this.motors.rightBack, 1) 
     ]); 
    }, 
    moveLeft: function() { 
     gpio.write(this.motors.leftFront, 1); 
    }, 
    moveRight: function() { 
     gpio.write(this.motors.rightFront, 1); 
    }, 
    stop: function() { 
     async.parallel([ 
      rpio.write(this.motors.leftFront, rpio.LOW), 
      rpio.write(this.motors.leftBack, rpio.LOW), 
      rpio.write(this.motors.rightFront, rpio.LOW), 
      rpio.write(this.motors.rightBack, rpio.LOW) 
     ]); 
    } 
}; 

io.sockets.on('connection', function(socket) { 
    socket.on('move', function(direction) { 
     switch(direction) { 
      case 'up': 
       tank.moveForward(); 
       break; 
      case 'down': 
       tank.moveBackward(); 
       break; 
      case 'left': 
       tank.moveLeft(); 
       break; 
      case 'right': 
       tank.moveRight(); 
       break; 
     } 
    }); 

    socket.on('stop', function(dir) { 
     tank.stop(); 
    }); 
}); 

tank.init(); 
+0

async.parallel принимает в качестве первого параметра набор функций. Каждая функция возвращает обратный вызов после его завершения. Вы проверили, возвращает ли rpio.write обратный вызов после его выполнения, обещание или ничего? – yBrodsky

ответ

0

rpio звонки и писать открытыми все синхронные вызовы в соответствии с Документами. Вам вообще не нужно использовать async, но если вы этого захотите, вам нужно обернуть вызовы функцией, которая выполняет обратный вызов, потому что это то, что ожидает async. Простой пример:

// wrap your synchronous function 
function wrap(fn) { 
    var args = Array.prototype.slice.call(arguments, 1); 
    return function (cb) { 
    try{ 
     var results = fn.apply(null, args); 
     cb(null, results); 
    } catch(e) { 
     cb(e); 
    } 
    } 
} 

async.parallel([ 
    wrap(rpio.write, this.motors.leftFront, rpio.LOW), 
    wrap(rpio.write, this.motors.leftBack, rpio.LOW), 
    wrap(rpio.write, this.motors.rightFront, rpio.LOW), 
    wrap(rpio.write, this.motors.rightBack, rpio.LOW) 
]); 

/* РЕАКЦИЯ КОММЕНТИРОВАТЬ */ В исходном коде, вы используете rpio, но затем в вашем комментарии вы сказали, что вы используете пи-GPIO. Библиотека имеет значение, и API для них очень разные. Например, функции rpio все синхронны, тогда как pi-gpio все асинхронны. В версии pi-gpio вы должны предоставить обратный вызов всем вашим вызовам функций pi-gpio (точно так же, как говорит ваша ошибка).

Самый простой способ изменить существующий код - это сильно использовать привязку параметров функции. Например, в вашей функции moveForward, вы в настоящее время:

moveForward: function(){ 
    async.parallel([ 
    rpio.write(this.motors.leftFront, rpio.HIGH), 
    rpio.write(this.motors.rightFront, rpio.HIGH) 

    ]); 
} 

Вы должны были бы связать этот первые два аргумент записи в функцию gpio.write, которая будет возвращать функцию, которая принимает последние из параметров ожидаемых (и в этот случай, если), обратный вызов. gpio.write принимает подпись, gpio.write(pin, highLow, callback), так как это сделать:

moveForward: function(){ 
    async.parallel([ 
    gpio.write.bind(this.motors.leftFront, rpio.HIGH), 
    gpio.write.bind(this.motors.rightFront, rpio.HIGH) 

    ]); 
} 

Если есть результат, который вы хотите. Хотя from the docs вы все равно должны подумать о том, как вы закрываете булавку.

+0

Я изменил ваш код и попытался его использовать, но я все еще получаю эту ошибку: '(node: 6979) DeprecationWarning: Вызов асинхронной функции без обратного вызова k устарел.'. Я использую модуль pi-gpio, потому что rpio не работает с моделью малины pi 3 B. –

Смежные вопросы