2016-11-10 63 views
0

场景: 我有一堆需要依次更改的firebase数据,如果出现问题,我需要停止进一步处理。nodejs中的async.waterfall问题

策略: 使用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>); 
    }); 
} 

回答

1

我读的问题,只要你想,如果出现错误停止执行。异步提供了一个非常好的方法来做到这一点。从文档:

但是,如果任何的任务传递一个错误,以自己的回调,不执行下一个功能,而主要的回调会立刻与错误称为 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>); 
    }); 
} 

如果缺少数据,是不是你担心的错误,你担心火力地堡的问题,你可以.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); 
    }); 
} 
+0

这帮助我在我的代码调试问题。我收到一个例外,我没有看到,因为我没有捕捉到它。 – Ahsan