我有一个嵌套函数,它执行一些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
函数通过在并行进程中执行回调函数开始。status
和err
参数将作为占位符放置在内存中。同时,getStatus
正在做他需要做的事情来检索您想要的状态并将其存储为变量。当读取完成后,结果被放置在并行进程的占位符中,然后执行结束。
这个异步方法来自于这样一个事实:你在硬件内部读取数据,并且需要一些时间来检索它。同步方式将阻塞任务并等待每个步骤完成,而异步方式允许不阻塞每个步骤,而是在完成前一个任务时启动其他任务。