解決しました。今後の参考のために:
わかりましたので、私は基本的にこれを持っていました:
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 で簡単に実行できることに気付きましたが、それは別の話です...