76

jQuery で JSONP を使用するときにエラーをキャッチすることは可能ですか? $.getJSON と $.ajax の両方のメソッドを試しましたが、どちらもテスト中の 404 エラーをキャッチしません。これが私が試したことです(これらはすべて正常に機能することに注意してください。ただし、失敗した場合は処理したいと思います):

jQuery.ajax({
    type: "GET",
    url: handlerURL,
    dataType: "jsonp",
    success: function(results){
        alert("Success!");
    },
    error: function(XMLHttpRequest, textStatus, errorThrown){
        alert("Error");
    }
});

また:

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    });

私も $.ajaxError を追加しようとしましたが、それもうまくいきませんでした:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});

返信ありがとうございます。

4

10 に答える 10

54

これは、同様の質問に対する私の広範な回答です。

コードは次のとおりです。

jQuery.getJSON(handlerURL + "&callback=?", 
    function(jsonResult){
        alert("Success!");
    })
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });
于 2013-09-29T07:49:39.967 に答える
51

成功した結果を返さない JSONP リクエストは、成功または失敗のイベントをトリガーすることはないようです。良くも悪くも、これは明らかに設計によるものです。

バグ トラッカーを検索したところ、タイムアウト コールバックを使用して解決できる可能性があるパッチがあります。バグレポート #3442を参照してください。エラーをキャプチャできない場合は、成功するまで妥当な時間待機した後、少なくともタイムアウトすることができます。

于 2008-11-21T20:27:54.070 に答える
16

JSONP問題の検出

依存関係をダウンロードしたくない場合は、エラー状態を自分で検出できます。それは簡単です。

ある種のタイムアウトを使用することによってのみ、JSONPエラーを検出できます。特定の時間内に有効な応答がない場合は、エラーと見なします。ただし、エラーは基本的に何でもかまいません。

エラーをチェックする簡単な方法は次のとおりです。successフラグを使用するだけです。

var success = false;

$.getJSON(url, function(json) {
    success = true;
    // ... whatever else your callback needs to do ...
});

// Set a 5-second (or however long you want) timeout to check for errors
setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

コメントで言及されているdawnriderのように、代わりにclearTimeoutを使用することもできます。

var errorTimeout = setTimeout(function() {
    if (!success)
    {
        // Handle error accordingly
        alert("Houston, we have a problem.");
    }
}, 5000);

$.getJSON(url, function(json) {
    clearTimeout(errorTimeout);
    // ... whatever else your callback needs to do ...
});

なんで?読む...


JSONPが簡単に機能する方法は次のとおりです。

JSONPは、通常のAJAXリクエストのようにXMLHttpRequestを使用しません。代わりに<script>、「src」属性がリクエストのURLであるタグをページに挿入します。応答の内容はJavascript関数でラップされ、ダウンロード時に実行されます。

例えば。

JSONPリクエスト:https://api.site.com/endpoint?this=that&callback=myFunc

Javascriptは、このスクリプトタグをDOMに挿入します。

<script src="https://api.site.com/endpoint?this=that&callback=myFunc"></script>

<script>タグがDOMに追加されるとどうなりますか?明らかに、それは実行されます。

したがって、このクエリへの応答が次のようなJSON結果を生成したとします。

{"answer":42}

ブラウザにとって、これはスクリプトのソースと同じであるため、実行されます。しかし、これを実行するとどうなりますか?

<script>{"answer":42}</script>

まあ、何も。それはただのオブジェクトです。保存も保存もされず、何も起こりません。

これが、JSONPリクエストが結果を関数にラップする理由です。JSONPシリアル化をサポートする必要があるサーバーは、callback指定したパラメーターを確認し、代わりにこれを返します。

myFunc({"answer":42})

次に、これが代わりに実行されます。

<script>myFunc({"answer":42})</script>

...これははるかに便利です。この場合、コードのどこかに次のようなグローバル関数がありますmyFunc

myFunc(data)
{
    alert("The answer to life, the universe, and everything is: " + data.answer);
}

それでおしまい。それがJSONPの「魔法」です。次に、タイムアウトチェックを組み込むのは、上記のように非常に簡単です。リクエストを行い、直後にタイムアウトを開始します。X秒後、フラグがまだ設定されていない場合、リクエストはタイムアウトになりました。

于 2012-08-03T16:21:54.323 に答える
14

この質問が少し古いことは知っていますが、問題の簡単な解決策を提供する答えが見つからなかったため、「簡単な」解決策を共有すると考えました。

$.getJSON("example.json", function() {
      console.log( "success" );
}).fail(function() { 
      console.log( "error" ); 
}); 

コールバックを使用して.fail()、エラーが発生したかどうかを確認できます。

お役に立てれば :)

于 2013-09-05T15:46:45.650 に答える
3

プロバイダーと協力している場合は、エラーが発生したときにコールバックする関数である別のクエリ文字列パラメーターを送信できます。

?コールバック=?&エラー=?

これは JSONPE と呼ばれますが、事実上の標準ではありません。

次に、プロバイダーは診断に役立つ情報をエラー関数に渡します。

ただし、通信エラーには役立ちません-Adam Bellaireの回答のように、タイムアウト時にエラー関数をコールバックするようにjQueryを更新する必要があります。

于 2010-06-05T20:06:55.363 に答える
2

これは現在機能しているようです:

jQuery(document).ajaxError(function(event, request, settings){
   alert("Error");
});
于 2010-01-18T12:03:27.280 に答える
1

これを使用してJSONエラーをキャッチします

try {
   $.getJSON(ajaxURL,callback).ajaxError();
} catch(err) {
   alert("wow");
   alert("Error : "+ err);
}

編集:あるいは、エラーメッセージを受け取ることもできます。これにより、エラーが正確に何であるかがわかります。catchブロックで次の構文を試してください

alert("Error : " + err);
于 2012-06-22T15:30:59.717 に答える
0

多分これは動作しますか?

.complete(function(response, status) {
    if (response.status == "404")
        alert("404 Error");
    else{
        //Do something
    }   
    if(status == "error")
        alert("Error");
    else{
        //Do something
    }
});

ステータスが「エラー」モードになるたびにわかりません。しかし、404でテストしたところ、応答しました

于 2012-09-13T13:13:34.100 に答える