私が使用しようとしている約束ベースのコードは、完全な応答を得るたびに問題になります。私は.onでデータリスナーを使用していましたが、テストでは各呼び出しでデータリスナーを積み重ねていたため、.onceに変更しました。しかし、いずれにせよ私はときどき部分的な反応を得る。だからどうすればこの問題を解決できますか?リスナーをスタックするのではなく、毎回完全な応答を得る...約束を使ってそれを行う。ここでノードリスナーを積み重ねるリスナーと約束を使って完全な応答が得られない
sendPort: function(port, src) {
return new Promise((resolve, reject) => {
// .once, not stacking but sometimes incomplete responses, .on stacking listener
port.once('data', (data) => {
resolve(data); // TODO parse data here or maybe after return
});
port.once('error', (err) => {
reject(err);
});
// have same debug in .then after call showing listerner not removed with .on
Debug.L1('sendport num data listeners: ', port.listenerCount("data"));
port.write(src);
});
は、ここでは、コード
com.openPort(port).then(port => {
_.pTimeout(3000, com.sendPort(port, NCD.gen(args.cmd)))
.then(received => {
console.log('complete response: ', NCD.parse(received));
Debug.L1('resolved num data listeners: ', port.listenerCount("data"));
})
})
.catch(function(e) {
console.log('error: ', e)
});
を呼び出している.onを使用して、出力が4回、完全な応答が[ 170, 1, 0, 171 ]
debug:1 api command array: +0ms [ 170, 3, 254, 175, 0, 90 ]
debug:1 sendport num data listeners: +1ms 4
complete response: [ 170 ]
debug:1 resolved num data listeners: +2ms 4
応答だった別の時間[170、1されている必要がありますと呼ばれています、0]、ほとんどの時間私は完全な応答を返す。
結果は.onceと似ていますが、リスナーはスタックされません。
debug:1 sendport num data listeners: +0ms 1
complete response: [ 170, 1, 0 ]
debug:1 resolved num data listeners: +1ms 0
思考?アイデア?修正については約束を使用しています。
私のコードは私がここで見つけたアイデアから来ています。 Nodejs map serial port write to receive data
受信したデータが1つのチャンクではなく複数のチャンクである可能性があるため、解決する前にまずデータを渡してください。 – Tim
「データを最初に解析する」という意味ですか?そうであれば、解析されたデータを生。私は議論していた(TODOコメントで)。まだそれがそれを行うことを確信していますが、私は試して報告する – DKebler