0

複数のajax関数を1つのリクエストにマージするjavascript関数を作成しました。リクエストごとに、ほとんどの場合、コールバック関数があります。バンドルされた関数は、コールバック関数を一度に1つずつ呼び出します。

これらをtrycatchで囲んで、1つの関数が他の関数の実行を妨げないようにしました。ただし、JavaScriptエラーについてブラウザに通知してもらいたいのですが。これどうやってするの?

ここで私がやろうとしていることの例を示しました。

上記のjsfiddleリンクのコード:

<script>
function doSomeStuff() {
    for (var i in arguments) {
        try { 
            arguments[i].apply(this);
        }
        catch (e) {
            throw e;
        }
    }
}

doSomeStuff(function() { console.log("i'm an apple"); }, 
    function() { imnotavariable = test; },
    function() { console.log("i'm an apple too"); });
</script>

質問の要約:ブラウザにエラーを報告しながら、エラーをキャッチするにはどうすればよいですか?

4

2 に答える 2

3

ループを終了させたい場合(つまり、すべての関数を呼び出したい場合)、ループ内でエラーをスローすることはできません。目的を達成するための1つのアプローチは、エラーを保存してループの後にスローすることです。

var error = null;
for (...) {
  try {
    ...
  }
  catch(e) {
    error = e;
  }
}
if(error != null) { throw error; }

ただし、これは最後のエラーのみを伝播します。発生したすべてのエラーをキャッチしたい場合は、それらを1つのエラーにマージして、再度スローできるようにする必要があります。

トムによる代替ソリューション

throw関数の実行に干渉しないように、にタイムアウトを設定することもできます。

function doSomeStuff() {
  for (var i in arguments) {
    try { 
      arguments[i].apply(this);
    }
    catch (e) {
      setTimeout(function() { throw e; }, 100);
    }
  }
}
于 2013-03-22T13:48:31.407 に答える
0

「ブラウザに報告する」とはどういう意味かを定義する必要があります。

簡単な答えは、代替のロギングシステムがある場合は、次のようなことを試すことができるということかもしれません。

    var apperrors;

    function appLog(error){
        apperrors = apperrors || [];
    
        apperrors.push(error);
       //maybe trigger an app error event?
    }
    
    function doSomeStuff() {
        for (var i in arguments) {
            try { 
                arguments[i].apply(this);
            }
            catch (e) {
                appLog(e);
            }
        }
    }

そして、あなたのエラーで何かをします。あなたはそれが何であるかを実際には説明していません。

編集

以下のコメントに続いて:エラーを見つけた場合、私が見ることができる3つの行動方針があります:

  • それを無視してください(それは悪いです)
  • それを投げ直して、何か追加のことをします(つまり、ユーザーにもっと優雅に通知したいからです)
  • またはエラーをキャッチし、それほど積極的ではない他の方法でそれを処理します

「追加」の何かをしない限り、何も得られないエラーを再スローします。

于 2013-03-22T13:50:07.820 に答える