nodejs中的async.waterfall问题

时间:2016-11-10 05:16:32

标签: node.js firebase async.js

方案: 我有一堆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>);
  });
}

1 个答案:

答案 0 :(得分:1)

我正在阅读这个问题,因为如果出现问题你想停止执行。 Async提供了一种非常好的方法。来自docs:

  

但是,如果任何任务将错误传递给自己的回调,则不执行下一个函数,并立即调用主回调并显示错误   http://caolan.github.io/async/docs.html#waterfall

如果出现问题,您应该可以将callback作为第一个arg调用错误。您已为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()错误,因为您使用的是“可用”引用: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 );
  });
}