节点:async.foreach 在引发错误未捕获异常时以静默方式失败



我正在将一些异步执行的'子'函数包装在一个异步中.for每个构造(来自伟大的库:https://github.com/caolan/async)

当其中一个子函数失败并出现未捕获的异常时,整个节点进程将挂起。(由于回调永远不会返回到 async.forEach 构造,因此 async.forEach 仍然认为子函数很忙)

但是,我认为至少抛出的异常会冒泡,因为我没有在任何地方捕获它。有没有办法配置 async.forEach 如何处理这些异常?针对这一点进行编程真的很难。

已解决。供将来参考:

好的,所以我基本上有这个:

var async = require("async");
var cb = function(){
   //denote done to async.foreach
}
async.forEach(defaultFunctions,function(defaultFunc,cb){   
  defaultFunc(cb);
},callback);

问题是,当某个 defaultFunction 抛出未捕获的异常时,该异常会被 async.forEach 吞噬。此外,无法在调用上下文中捕获它。

结果很严重:父节点进程完全停止,没有任何导致它的恍惚

在调用的上下文中(即:抛出异常的 defaultFunction),我当然可以一丝不苟地尝试捕获所有异常,但这些函数是可热插拔的,最终可能有数百个,我不想给这些函数中的每一个增加负担 100% 完全证明的错误处理。

我发现的一个解决方案是使用 promise(使用 Q 库 -> github.com/kriskowal/q )将函数包装在:

var async = require("async")
var Q = require("q");
var cb = function(){
   //denote done to async.foreach
}
async.forEach(defaultFunctions,function(defaultFunc,cb){   
  var obj = {
    defaultFunc: defaultFunc
  } 
  return Q.ncall(obj.defaultFunc,obj)
    .then(function(result){
       return cb() ;
    }fail(function(err){
       return cb(err); //ANY thrown uncaught error in obj.defaultFunc will get 
                       //caught and changed to a correct callback as needed
                       //for async.forEach
    }
},callback);

当然,现在我意识到 async.foreach 可以用 Q.promise 轻松完成,但那是另一回事了......

最新更新