在回调函数中操作数据

Manipulating data in a callback function

本文关键字:操作数 数据 操作 回调 函数      更新时间:2023-09-26

我有一个嵌套函数,它执行一些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));

,但这没有任何作用。正如它所看到的,瀑布中的第二个函数从未被调用过。这可能是因为第一个函数的回调的结构不像瀑布图中预期的那样,它返回callback(data)而不是callback(null, data)

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

你要做的是

操作返回给returnCallback的数据并创建and对象,每个参数有一个属性。

你有

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

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