场景:我需要对大量的防火墙数据进行顺序更改,如果发生故障,我需要停止进一步的处理。
策略:使用async.waterfall。通过这种方式,我可以根据需要将变量传递到下一次迭代和信号失败。
问题:当我有三个或更多的数据项要修改时,我会在第二个数据项之后卡住,尝试进行回调。
代码:
var processData = function(<params>) {
var funcArray = [];
funcArray.push(processItemInitial);
for(var i = 0; i < length - 1; i++) {
funcArray.push(processItem);
}
async.waterfall(funcArray, function (err, status) {
console.log("status: " + status);
console.log("err: " + err);
});
}
//uses global variable
var processItemInitial = function (callback) {
productsRef.child(<some var>).child('quantity').transaction(function(data){
if(data != null) {
//do stuffs
} else {
console.log("null data");
}
return data;
}).then(function() {
callback(<params>);
});
}
// uses variables passed through call backs
var processItem = function (<params>) {
productsRef.child(<some var>).child('quantity').transaction(function(data){
if(data != null) {
//do stuffs
} else {
console.log("null data");
}
return data;
}).then(function() {
callback(<params>);
});
}发布于 2016-11-10 17:07:11
我读到这个问题是因为如果出了什么问题,你要停止执行。异步提供了一种非常好的方法来做到这一点。从医生那里:
但是,如果任何任务将错误传递给它们自己的回调,则不会执行下一个函数,并且将立即使用错误http://caolan.github.io/async/docs.html#waterfall调用主回调。
如果出了问题,您应该能够将错误作为第一个arg调用callback。您已经为if ( data != null )设置了用例,所以使用else用例发送callback( 'No data found for <some var>' )
var processItem = function (<params>) {
productsRef.child(<some var>).child('quantity').transaction(function(data){
if(data != null) {
//do stuffs
} else {
callback( 'Data not found for <some var>' );
console.log("null data");
}
return data;
}).then(function() {
callback(<params>);
});
}如果缺乏数据不是您所担心的错误,而是您担心Firebase问题,您可以使用.catch()错误,因为您使用的是"Thenable“引用:https://firebase.google.com/docs/reference/js/firebase.Thenable#catch
var processItem = function (<params>) {
productsRef.child(<some var>).child('quantity').transaction(function(data){
if(data != null) {
//do stuffs
} else {
console.log("null data");
}
return data;
}).then(function() {
callback(<params>);
}).catch( function( error ) {
// Will exit the waterfall
callback( error );
});
}https://stackoverflow.com/questions/40520402
复制相似问题