我有两个功能:
function manipulateData(data,callback)
function isDataValid(data)
第一个应该操纵数据并且不返回任何内容,第二个应该根据数据的结构返回true,而不是完全操纵它。
假设有三件事:
- 操纵不需要有效数据。
- 数据的验证过程非常苛刻。
- 数据的验证过程应该接收原始数据。
如何使用验证函数作为回调参数,因此我可以在后台验证它,如果发现数据无效,只能从第一个函数抛出错误?
我希望它表现得像这样,第一个语句在后台运行,不会阻止数据操作。
function manipulateData(data, callback){
if(callback(data)==false){ return some error }
...manipulate data without waiting for the verification...
}
我希望它确实可行,并且我没有错过回调机制中的关键逻辑部分。
答案 0 :(得分:0)
您可以使用回调或承诺执行此操作。使用回调,你想使用像async这样的东西,但我绝对会使用Promises(或async / await)。
你说验证是I / O很重,所以我们假设这是一个异步函数。我假设操纵不是,但是一旦你使用Promise.all
来封装它们并不重要。
以下是在节点6.10中测试的。它测试验证失败和成功,我非常确定我已经测试了每个函数在另一个函数之前完成测试,但无论如何Promise.all
再次为你处理。
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
function manipulateData (data, zzz) {
if (zzz) {
sleep(zzz);
}
return 'manipulated data';
}
function isDataValid (data) {
return new Promise((resolve, reject) => {
if (data) {
resolve('ok');
} else {
reject(new Error('nok'));
}
});
}
function updateData (data, zzz) {
return Promise.all([
isDataValid(data),
manipulateData(data, zzz)
]);
}
function testIt (data, zzz) {
return updateData(data, zzz)
.then(([result, data]) => console.log(`Success! ${result} - ${data}`))
.catch(err => console.log(`Fail! ${err}`));
}
testIt(true, 0)
.then(() => testIt(false, 0))
.then(() => testIt(true, 1000))
.then(() => testIt(false, 1000));
成功!好的 - 操纵数据
失败!错误:nok
成功!好的 - 操纵数据
失败!错误:nok