web-dev-qa-db-ja.com

$ .getJSONが静かに失敗するのはなぜですか?

返されたデータが有効なJSONでない場合、jQueryの _$.getJSON_ が暗黙的に失敗するのは非常に不便なようです。なぜこれがサイレント障害で実装されたのですか?優れた障害動作でgetJSONを実行する最も簡単な方法は何ですか(例:例外、console.log()、その他をスローします)?

43
Dan Burton

使用できます

        function name() {
            $.getJSON("", function(d) {
                alert("success");
            }).done(function(d) {
                alert("done");
            }).fail(function(d) {
                alert("error");
            }).always(function(d) {
                alert("complete");
            });
        }

エラーの原因を確認したい場合は、フルバージョンを使用してください

function name() {
    $.getJSON("", function(d) {
        alert("success");
    }).fail( function(d, textStatus, error) {
        console.error("getJSON failed, status: " + textStatus + ", error: "+error)
    });
}

JSONの形式が適切でない場合、次のように表示されます

getJSON failed, status: parsererror, error: SyntaxError: JSON Parse error: Unrecognized token '/'

URLが間違っている場合、次のように表示されます

getJSON failed, status: error, error: Not Found

Same-Origin policy に違反して、別のドメインからJSONを取得しようとすると、このアプローチは空のメッセージを返します。 JSONP( limitations )またはSame-Origin Resource Sharingの推奨方法( [〜#〜] cors [〜 #〜] )。

84
Mr Shoubs

ドキュメントから直接:

重要: jQuery 1.4では、JSONファイルに構文エラーが含まれている場合、通常、要求はサイレントに失敗します。

ドキュメントのページにあるように、getJSONは単に

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback
});

失敗時の動作を取得するには、次のように$ .ajaxを使用できます。

$.ajax({
    url: url,
    dataType: 'json',
    data: data,
    success: callback,
    error: another callback
});
29
Håvard

$.ajax 代わりに、dataTypeオプションを「json」に設定します。ドキュメントから:

「json」:応答をJSONとして評価し、JavaScriptオブジェクトを返します。 jQuery 1.4では、JSONデータは厳密な方法で解析されます。不正なJSONはすべて拒否され、解析エラーがスローされます。 (適切なJSON形式の詳細については、json.orgを参照してください。)

3
karim79

このAPIのドキュメントをご覧ください... .errorがあります。

http://api.jquery.com/jQuery.getJSON/

0
CrazyDart

応答としてJSONPをリクエストしている場合、応答がない場合(ネットワークの停止など)、サイレントフェイルが発生します。詳細については、 this thread を参照してください。

0
b.squared