nodejs 中 async.waterfall 的问题
Issue with async.waterfall in nodejs
场景:
我有一堆 firebase 数据需要按顺序更改,如果出现问题,我需要停止进一步处理。
策略:
使用 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>);
});
}
我正在阅读这个问题,因为你想在出现问题时停止执行。异步提供了一种非常好的方法来做到这一点。来自文档:
However, if any of the tasks pass an error to their own callback, the next function is not executed, and the main callback is immediately called with the error
http://caolan.github.io/async/docs.html#waterfall
如果出现问题,您应该能够调用 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 );
});
}
场景: 我有一堆 firebase 数据需要按顺序更改,如果出现问题,我需要停止进一步处理。
策略: 使用 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>);
});
}
我正在阅读这个问题,因为你想在出现问题时停止执行。异步提供了一种非常好的方法来做到这一点。来自文档:
However, if any of the tasks pass an error to their own callback, the next function is not executed, and the main callback is immediately called with the error http://caolan.github.io/async/docs.html#waterfall
如果出现问题,您应该能够调用 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 );
});
}