首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs中的async.waterfall问题

nodejs中的async.waterfall问题
EN

Stack Overflow用户
提问于 2016-11-10 05:16:32
回答 1查看 307关注 0票数 0

场景:我需要对大量的防火墙数据进行顺序更改,如果发生故障,我需要停止进一步的处理。

策略:使用async.waterfall。通过这种方式,我可以根据需要将变量传递到下一次迭代和信号失败。

问题:当我有三个或更多的数据项要修改时,我会在第二个数据项之后卡住,尝试进行回调。

代码:

代码语言:javascript
复制
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>);
  });
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>' )

代码语言:javascript
复制
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

代码语言:javascript
复制
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 );
  });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40520402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档