Javascript 在回调函数中操作数据

Javascript 在回调函数中操作数据,javascript,node.js,asynchronous,callback,waterfall,Javascript,Node.js,Asynchronous,Callback,Waterfall,我有一个嵌套函数,它执行一些I/O操作,并在处理完结果数据后调用回调。大概是这样的: function getStatus(returnCallback, errorCallback) { sendRequest('someData', returnCallback, errorCallback) } sendRequest()是一个与硬件交互的函数,如果出现问题,它会使用从硬件或errorCallback获得的数据调用returCallback。 我现在的问题是,硬件返回的数据是一个非

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

function getStatus(returnCallback, errorCallback) {
   sendRequest('someData', returnCallback, errorCallback)
}
sendRequest()是一个与硬件交互的函数,如果出现问题,它会使用从硬件或errorCallback获得的数据调用returCallback。 我现在的问题是,硬件返回的数据是一个非常长的字符串,由代表不同参数的不同数字组成。我要做的是操作提供给returnCallback的数据,并为每个参数创建一个带有属性的and对象。有办法吗?我已经尝试过使用async.瀑布

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

但那没用。看起来瀑布中的第二个函数从未被调用。这可能是因为来自第一个函数的回调在瀑布中的结构与预期不同,它返回的是回调(数据),而不是回调(null,数据)

async中。瀑布
callback中,第一个参数也是
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的数据,并创建和 对象,每个参数都有一个属性

你有

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
函数通过在并行进程中执行回调函数开始。
状态
错误
参数将作为占位符放置在内存中。同时,
getStatus
正在做他需要做的事情,以检索您想要的状态并将其存储为变量。读取完成后,结果将被放置在并行进程的占位符中,然后执行完成


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

是否有一种方法可以结合我有第二个回调函数来负责错误这一事实?当sendRequest返回错误时,瀑布会停止吗?类似于
sendRequest('someData',functon(data){callback(null,data)},function(error){callback(error,null)})
如果瀑布没有这样做,目标是在瀑布的末尾,如果出现错误,跳过所有剩余的步骤,或者在瀑布的末尾传递,检查错误并处理它们。是的,这就是我的意思。我的函数有两个回调函数,如果没有大量的工作,我无法更改它们。如何让async.瀑布知道sendRequest函数中发生了错误(调用了errorCallback,而不是returnCallback),因此它会跳到最后?不直接调用
errorCallback
,而是传递一个匿名回调,该回调将传递错误,因为会传递错误,
瀑布式
将跳到末尾,因此您可以调用错误回调。看看我的编辑,它应该是你需要的:)