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