13

Chromeでテストして、AppEngineアプリにGETリクエストを送信しています。javascriptコンソールでは、一部の呼び出しで500サーバーエラーが発生することがわかりますが、同様のSOスレッドを多数読み取ったにもかかわらず、jQueryコードでこのエラーをキャプチャする方法を見つけることができないようです。サーバー側のエラーを示していることは理解していますが、JavaScriptからそのようなエラーをキャプチャできるようにしたいと思います。

エラーをキャプチャして、応答の数(成功したかどうかに関係なく)をカウントし、すべての呼び出し応答が受信されたときに別の関数をトリガーできるようにする必要があります。

Chromeコンソールの出力:

GET http://myapp.com/api?callback=jQuery12345&params=restOfParams 500 (Internal Server Error)

私の電話:

  function makeCall() {
    var count = 0;
    var alldata = $('#inputset').val();
    var rows = alldata.split('\n');
    var countmatch = rows.length;
    for (i=0;i<rows.length;i++) {
      data["param"] = rows[i]["val"];
      $.ajax({
              url: apiUrl,
              type: 'GET',
              data: data,
              dataType: 'jsonp',
              error: function(){
                  alert('Error loading document');
                  count +=1;
              },
              success: function(responseJson) {
                            count +=1;
                            var res = responseJson.results;
                            if (count == countmatch) {
                              allDoneCallback(res);
                            }
                        },
             });
    }
}

私は次のいくつかを試しました:
追加:

statusCode: {500: function() {alert('err');}}

呼び出しに。

使用:

  $().ready(function(){
     $.ajaxSetup({
       error:function(x,e) {
             if(x.status==500) {
               alert('Internel Server Error.');
             }
           }
      });
   });

500の応答をどのようにキャッチできるかについて誰かが提案を持っていますか?

ありがとうオリ

アップデート:

応答に基づくと、私のjqueryコードは正しいように見えますが、何らかの理由で、アプリから受信した特定の500の応答しかキャッチしません。これは、App Engineがエラーを返す方法(これについてはよくわかりません)、またはjqueryがjsonpでエラーを処理する方法に問題がある可能性があります-この点については、この記事の最後の段落で簡単に説明します。

アプリによってスローされた500のステータスすべてをキャッチするjquery-isonpを使用して、これを機能させました。

4

3 に答える 3

4

document.readyjQueryのバインディングを正しく使用しているようには見えません。この$().ready(...)バージョンは多かれ少なかれ非推奨です。代わりに、次のいずれかを試してください。

$(document).ready(function() {
    $.ajaxSetup({
        error: function(x, e) {
            if (x.status == 500) {
                alert('Internel Server Error.');
            }
        }
    });
});

または速記

$(function() {
    $.ajaxSetup({
        error: function(x, e) {
            if (x.status == 500) {
                alert('Internel Server Error.');
            }
        }
    });
});
于 2011-03-24T14:17:26.110 に答える
1

jQueryを1.9.1から2.1.1にアップグレードすることで問題を解決しました—.error()サーバーの応答ですぐに呼び出しを開始しました(500の応答を無視し、タイムアウトが終了するまで待機します)。

制限:jQuery 2.1.1はIE8以下をサポートしていません(IMOはサポートしないはずです)

于 2014-08-25T18:44:39.387 に答える
1

同様の問題がありました。jqueryの.done、.fail、.alwaysのpromise関数を使用していましたが、500の内部サーバーエラーが発生した場合、どの関数も起動しませんでした(done、fail、always、error)。とても奇妙です。

最後に、.ajaxオプションにタイムアウトを追加しました。タイムアウトに達すると、エラーがスローされ、.failメソッドも実行されます。

searchify.myAjaxSearchTerms = $.ajax({
                        'url': url,
                        type: "GET",
                        'dataType': 'jsonp',
                        'jsonp': 'json.wrf',
                        'jsonpCallback': searchify.cbFunc,
                        timeout: 4000, //needed for 500 errors - will go to fail block on timeout
                        beforeSend: searchify.beforeSendAutocomplete

                    });
searchify.myAjaxSearchTerms.fail(function(XHR, status, error){
                        searchify.clearForm();
                        searchify.renderWarningForNoQuery('<div class="notify-bubble"><span class="icon" data-icon="8" aria-hidden="true"></span><span>Sorry. We had a problem performing that search...<br/>Please try again<br/>Enter a <strong>product name</strong>, <strong>catalogue number</strong> or <strong>keyword</strong></span></div>');
                    });
于 2014-09-29T11:24:48.613 に答える