2017-01-30 5 views
1

私はnodejsでかなり初心者ですので、何か簡単な質問があれば嫌いな流れをさせてください。Node.js async parallel TypeError:タスクはラズベリーパイの関数ではありません

2つのモーターを制御するためにラズベリーパイ3にnodejsを使用しようとしています。私は、非同期タスクは関数エラーではありません。私は答えを探していたが、私が見つけたものは誰も私のために働いていなかった。私はこれで手を使うことができた。以下

コードである: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はまったく使用する必要はありませんが、そうしたい場合は、コールバックをとる関数で呼び出しをラップする必要があります。これは、非同期が期待しているものなのでです。簡単な例:あなたの元のコードでは/ *コメントに

// 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を使用していると述べました。ライブラリは重要であり、2つのAPIは非常に異なっています。たとえば、rpio関数はすべて同期ですが、pi-gpioはすべて非同期です。 pi-gpioバージョンでは、pi-gpio関数へのすべての呼び出しにコールバックを提供する必要があります(エラーが示すように)。

既存のコードを変更する最も簡単な方法は、関数パラメータバインディングを大量に使用することです。あなたのmoveForward機能ではたとえば、あなたが現在持っている:あなたが期待される最後のparamを取る関数を返しますgpio.write機能、(にとして、それらの最初の2つの書き込み引数をバインドする必要があると思い

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

    ]); 
} 

をこの場合、提供される)、コールバック。 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は廃止されました。 rpioがラズベリーパイモデル3のBで動作しないので、私はpi-gpioモジュールを使用しています。 –

関連する問題