我将一些异步执行的“子”函数包装在 async.forEach 构造中(来自伟大的库:https ://github.com/caolan/async )
当这些子函数之一因未捕获的异常而失败时,整个节点进程将挂起。(因为回调永远不会返回到 async.forEach 构造,async.forEach 仍然认为子函数很忙)
但是我会认为至少抛出的异常会冒泡,因为我没有在任何地方捕捉到它。有没有办法配置 async.forEach 如何处理这些异常?对此进行编程真的很困难。
我将一些异步执行的“子”函数包装在 async.forEach 构造中(来自伟大的库: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.promises 轻松完成,但那是另一回事了......