2016-08-09 10 views
-1

私はいくつかのI/Oを実行するネストされた関数を持っており、結果のデータが終わったらコールバックを呼び出します。このような何か:コールバック関数でデータを操作する

function getStatus(returnCallback, errorCallback) { 
    sendRequest('someData', returnCallback, errorCallback) 
} 

せるのsendRequest()は、ハードウェアと相互作用し、何かが間違っていた場合には、それはハードウェアまたはerrorCallbackから得たデータとreturCallbackを呼び出す関数です。 今、私の問題は、ハードウェアから返されるデータが、さまざまなパラメータを表す異なる数字で構成される本当に長い文字列であることです。私がしたいのは、returnCallbackに与えられたデータを操作し、各パラメーターのプロパティーを作成してオブジェクト化することです。それを行う方法はありますか?私はすでにasync.waterfallを使ってみました。

function getStatus(returnCallback, errorCallback) { 
     let returnArray = {}; 
     async.waterfall([ 
      function (callback) { 
       sendRequest('someData', callback, errorCallback); 
      }, 
      function (data, callback) { 
       returnArray.statusBits = data.slice(0, 6); 
       returnArray.faultBits = data.slice(7, 13); 
       returnArray.alertBits = data.slice(14, 20); 
       returnArray.pumpRotationSpeed = parseInt(data.slice(21, 26)); 
       returnArray.motorPower = parseInt(data.slice(27, 31)); 
       returnArray.frequencyConverterTemperature = parseInt(data.slice(36, 39)); 
       returnArray.pumpOperationTime = parseInt(data.slice(44, 48)); 
       callback(null, returnArray) 
      } 
     ], returnCallback(returnArray)); 

しかし何もしません。見えるように、滝の第2の機能は決して呼び出されません。これは滝に期待どおりに最初の関数からコールバックが構成されていないためかもしれないし、それがasync.waterfallコールバックでコールバック(データ)の代わりコールバックの(NULLデータ)

答えて

1

と戻り、最初の引数でありますerrorまた、関数を終了する前に、滝の終わりを待つことになっています。正しいコードは次のようになります。あなたが何をしたいか

function getStatus(returnCallback, errorCallback) { 
    let returnArray = {}; 
    async.waterfall([ 
     function (callback) { 
      //First step 
      sendRequest('someData', function (data) { 
       //Everything is fine, continue 
       callback(null, data); 
      }, function (error) { 
       //Error, skip all remaining step, and handle the error 
       callback(error); 
      }); 
     }, 
     function (data, callback) { 
      //Second step 
      returnArray.statusBits = data.slice(0, 6); 
      returnArray.faultBits = data.slice(7, 13); 
      returnArray.alertBits = data.slice(14, 20); 
      returnArray.pumpRotationSpeed = parseInt(data.slice(21, 26)); 
      returnArray.motorPower = parseInt(data.slice(27, 31)); 
      returnArray.frequencyConverterTemperature = parseInt(data.slice(36, 39)); 
      returnArray.pumpOperationTime = parseInt(data.slice(44, 48)); 
      callback(null, returnArray) 
     } 
    //In normal case, error will be null, and the param will be the last passed to the callback of the last step 
    ], function (error, returnArray) { 
     //If there is a error (like error in step 1) 
     if(error) { 
      //Handle the error 
      errorCallback(error); 
     } else { 
      //No error, continue with the normal callback 
      returnCallback(returnArray); 
     } 
    }); 
} 
+0

正しい方向に私を指摘してくれてありがとう –

+0

実際には、エラーの原因となる2番目のコールバック関数があるという事実を組み込む方法はありますか? sendRequestがエラーを返すと、滝が止まるようにしますか?何かのようなもの 'sendRequest( 'someData'、functon(data){callback(null、data)}、function(エラー){callback(error、null)})' –

+0

あなたはそれを滝で、目標は、エラーの場合は残りのすべてのステップをスキップするか、または滝の最後で、エラーをチェックして処理して、滝の最後に行くことです。 – DrakaSAN

0

がreturnCallbackに与えられたデータを操作して作成し、各パラメータのプロパティを持つ オブジェクトです。私はあなたがやろうとしているものを理解している場合

あなたは

function getStatus(returnCallback, errorCallback) { 
    sendRequest('someData', returnCallback, errorCallback) 
} 

を持って、ここで
function getStatus(function(err, status) { 
    if (err) return new Error('Something went wrong'); 
    else sendRequest(status); 
} 
//get what you need here 
var status = ...) 

、並列プロセスにコールバック関数を実行することによって、 getStatus機能開始。 statuserrのパラメータは、メモリ内のプレースホルダとして配置されます。同時に、 getStatusは、必要なステータスを取得して変数として保存するために必要な処理を行っています。読み込みが完了すると、結果は並列プロセスのプレースホルダの内側に配置され、実行が終了します。

この非同期メソッドは、ハードウェア内のデータを読み取っているため、取得に時間がかかります。同期方法はタスクをブロックし、すべてのステップが完了するのを待つが、非同期的には、すべてのステップでブロックしないで、前のタスクを終了している間に他のタスクを開始することができる。

関連する問題