-1

いくつかの I/O を実行し、結果データの処理が完了したらコールバックを呼び出すネストされた関数があります。このようなもの:

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

sendRequest() は、ハードウェアと対話し、ハードウェアから取得したデータで returCallback を呼び出すか、何か問題が発生した場合に errorCallback を呼び出す関数です。私の問題は、ハードウェアが返すデータが、さまざまなパラメーターを表すさまざまな数値で構成される非常に長い文字列であることです。私がやりたいことは、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 番目の関数が呼び出されることはありません。これは、最初の関数からのコールバックがウォーターフォールで期待どおりに構成されておらず、 callback(null, data )ではなく callback(data)で返されるためである可能性があります。

4

2 に答える 2

1

コールバックではasync.waterfall、最初の引数は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);
        }
    });
}
于 2016-08-09T14:52:36.630 に答える
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必要なステータスを取得して変数として保存するために必要なことを実行しています。読み取りが完了すると、結果が並列プロセスのプレースホルダー内に配置され、実行が終了します。

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

于 2016-08-09T15:24:40.560 に答える