2

async.forEach コンストラクトでいくつかの非同期実行された「子」関数をラップしています (素晴らしいライブラリから: https://github.com/caolan/async )

これらの子関数の 1 つがキャッチされない例外で失敗すると、ノード プロセス全体がハングします。(コールバックが async.forEach コンストラクトに返されることはないため、async.forEach は引き続き子関数がビジーであると見なします)

ただし、どこにもキャッチしていないため、少なくともスローされた例外がバブルアップすると考えていました。async.forEach がこれらの例外を処理する方法を構成する方法はありますか? これに対してプログラミングするのは本当に難しいです。

4

1 に答える 1

1

解決しました。今後の参考のために:

わかりましたので、私は基本的にこれを持っていました:

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 で簡単に実行できることに気付きましたが、それは別の話です...

于 2012-10-11T20:25:18.680 に答える