Javascript 在回调函数中操作数据
我有一个嵌套函数,它执行一些I/O操作,并在处理完结果数据后调用回调。大概是这样的: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。 我现在的问题是,硬件返回的数据是一个非
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
,而是传递一个匿名回调,该回调将传递错误,因为会传递错误,瀑布式
将跳到末尾,因此您可以调用错误回调。看看我的编辑,它应该是你需要的:)