在回调函数中操作数据

Manipulating data in a callback function

我有一个嵌套函数,它执行一些 I/O 并在处理完结果数据后调用回调。像这样:

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

其中 sendRequest() 是一个与硬件交互的函数,它使用从硬件获得的数据调用 returCallback,或者在出现问题时调用 errorCallback。 我现在的问题是,硬件 returns 的数据是一个非常长的字符串,由代表不同参数的不同数字组成。我想要做的是操纵提供给 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));

但这没有任何作用。看起来瀑布中的第二个函数从未被调用。这可能是因为第一个函数的回调在瀑布中的结构不符合预期,它 returns 使用 callback(data) 而不是 callback(null , 数据)

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);
        }
    });
}

你想做的是

manipulate the data that is given to the returnCallback and create and object with a property for each parameter.

你有

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 正在做他需要做的事情来检索您想要的状态并将其存储为变量。读取完成后,将结果放入并行进程的占位符中,然后执行结束。

这种异步方法来自这样一个事实,即您正在读取硬件内部的数据,并且需要一些时间来检索它。同步方式会阻塞任务并等待每个步骤完成,而异步方式允许不在每个步骤都阻塞,而是在完成前一个任务的同时启动其他任务。