2017-01-05 10 views
0

私は自社用の内部NPMモジュールを作成しているので、アプリケーションがハードウェアデバイスとやりとりすることができます。問題は、私が作成しようとしている1つのメソッドが非同期に実行する必要があることです。私は関数がデバイスから読み込むコマンドを送信し、それが返るのを待つ(デバイスライブラリがこれを処理する)ようにして、結果を解析します。私が望むのは、他の開発者がexports.getResolution()を呼び出して値を取得できることです。私は、コールバック地獄、約束、青い鳥、ES6非同期機能、および他のソリューションの束を試してみましたが、私はこの1つだけを把握することはできませんノードモジュールでasyncを使用する - 結果を返すには?

var async = require('async'); 

exports.getResolution = async.series([ 
    function(callback) { 
    board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), (function(received) { 
      var hex = bufferlib.sortReceivedHex(received); 
      var status = parseInt('0x' + hex.substring(0, 1), 16); 
      var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16); 
      var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16); 
      callback(null, { 
       'status': status, 
       'vertical': verticalResolution, 
       'horizontal': horizontalResolution 
      }); 
     })); 
    } 
], 
// optional callback 
function(err, results) { 
    status = results[0]; 
    return results[0]; 
}); 

console.log(exports.getResolution); 

:ここに関連部分と私のファイルの抜粋です。私の最近の試みでは非同期ノードモジュールを使って非同期的にコードを実行しようとしていますが、最終的なコールバックが受け取る実際の値を返すためにexports.getResolutionを取得する必要があります。私は間違って何をしていますか?この仕事をするために私は何ができますか?ありがとうございました。

答えて

1

非同期呼び出しを同期しようとするのは良い考えではありません。あなたがする必要があるのは、結果がそこにあるときに実行するメソッドを登録することです。通常、これらのメソッドはコールバックと呼ばれますが、Promisesは非同期の結果を待つより良い方法です。

exports.getResolution = function() { 
    return new Promise(function(resolve, reject) { 
     function receiveHandler(received) { 
      var hex = bufferlib.sortReceivedHex(received); 
      var status = parseInt('0x' + hex.substring(0, 1), 16); 
      var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16); 
      var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16); 

      // If status would say something about it's success you could also 
      // use reject instead of resolve to indicate failure 
      resolve({ 
       'status': status, 
       'vertical': verticalResolution, 
       'horizontal': horizontalResolution 
      }); 
     } 

     board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), receiveHandler); 
    } 
} 

// Usage 
exports.getResolution().then(function(response) { 
    console.log('succesfully received response:', response); 
}, function(response) { 
    console.log('something went wrong:', response) 
}); 
0

これを行う正しい方法は、getResolution関数にコールバックパラメータを与えることです。これは本当にやるべきことです。

exports.getResolution = function(callback) { 
    board.sendAndReceive(bufferlib.generateBuffer("read", "0x00001220", "0x00000004"), function(received) { 
     var hex = bufferlib.sortReceivedHex(received); 
     var status = parseInt('0x' + hex.substring(0, 1), 16); 
     var verticalResolution = parseInt('0x' + hex.substring(1, 4), 16); 
     var horizontalResolution = parseInt('0x' + hex.substring(5, 9), 16); 
     callback(null, { 
      'status': status, 
      'vertical': verticalResolution, 
      'horizontal': horizontalResolution 
     }); 
    }); 
} 


console.log(exports.getResolution(function (err, results) { 
    console.log(results); 
})); 

上記の方法は、JSで物事の正しい方法です。ただし、getResolutionを同期させる必要がある場合は、this answerをチェックしてください。しかし、それはあなたのポーリングを可能にするためにいくつかの機能を変更する必要があるようだ...

+0

ありがとうございました。可能であれば潜在的なコールバック地獄を避けたいと思っていますが、私は時間を感謝し、あなたの応答に入れたと思っています。 – millipedeman

関連する問題