JSONPを使用しているときにjQuery $ .getJSON(またはデータ型を 'jsonp'に設定した$ .ajax)エラーをキャッチするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/309953

  •  08-07-2019
  •  | 
  •  

質問

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");
});

ご返信いただきありがとうございます!

役に立ちましたか?

解決

成功した結果を返さないJSONPリクエストは、イベント(成功または失敗)をトリガーしないようです。

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

他のヒント

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

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

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!'); });

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>タグを挿入します。ここで、<!> quot; src <!> quot;属性はリクエストの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>

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

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

{"answer":42}

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

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

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

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

myFunc({"answer":42})

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

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

...これははるかに便利です。この場合、コードのどこかに<=>:

というグローバル関数があります
myFunc(data)
{
    alert("The answer to life, the universe, and everything is: " + data.answer);
}

それだけです。それが<!> quot; magic <!> quot; JSONPの。タイムアウトチェックを組み込むのは、上記のように非常に簡単です。要求を行い、直後にタイムアウトを開始します。 X秒後、フラグがまだ設定されていない場合、リクエストはタイムアウトしました。

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

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

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

これが役立つことを願って:)

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

?callback =?<!> amp; error =?

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

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

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

このように動作しているようです:

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

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

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

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

alert("Error : " + err);

これでうまくいきますか

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

ステータスが<!> quot; error <!> quotになったときはいつでもわかりません。モード。しかし、私は404でそれをテストし、応答しました

ajaxリクエストに次の属性を追加することで、エラー番号を明示的に処理できます:

statusCode: {
        404: function() {
          alert("page not found");
        }
    }

そのため、コードは次のようになります:

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

これがあなたに役立つことを願って:)

この回答を stack overflow にも投稿しました-getJSON呼び出しでのエラー処理

誰かがここで答えてからしばらく経ちましたが、ポスターはおそらくここか他のどこかからすでに答えを得ていたと思います。ただし、この投稿は、getJSONリクエストの実行中にエラーとタイムアウトを追跡する方法を探している人に役立つと思います。したがって、質問に対する私の回答の下

getJSON構造は次のとおりです( http://api.jqueri.com ):

$(selector).getJSON(url,data,success(data,status,xhr))

ほとんどの人はそれを使用して実装します

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

ここで、url変数を使用してJSONデータへのリンクを提供し、datatosは"?callback=?"および正しいJSONデータを取得するために送信する必要があるその他の変数を追加する場所として送信し、成功関数はデータを処理するための関数。

ただし、成功関数にstatusおよびxhr変数を追加できます。ステータス変数には、次の文字列のいずれかが含まれます:<!> quot; success <!> quot;、<!> quot; notmodified <!> quot;、<!> quot; error <!> quot;、<!> quot ; timeout <!> quot ;、または<!> quot; parsererror <!> quot ;、およびxhr変数には返されたXMLHttpRequestオブジェクトが含まれます (w3schoolsで検出

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

この方法により、リクエストが完了すると開始されるカスタムタイムアウトトラッカーを実装しなくても、タイムアウトとエラーを簡単に追跡できます。

この質問への回答をまだ探している人がいることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top