web-dev-qa-db-ja.com

getJSON呼び出しでのエラー処理

GetJSON呼び出しでエラーを処理するにはどうすればよいですか? jsonpを使用してクロスドメインスクリプトサービスを参照しようとしていますが、エラーメソッドを登録するにはどうすればよいですか?

180
Ajay

$.getJSON()は、通常のAJAX呼び出しの一種の抽象化であり、JSONエンコードされた応答が必要であることを伝える必要があります。

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

エラーは2つの方法で処理できます。一般的に(実際に呼び出す前にAJAX呼び出しを構成することによって)、または具体的に(メソッドチェーンを使用して)。

「generic」は次のようになります。

$.ajaxSetup({
      "error":function() { alert("error");  }
});

そして、「特定の」方法:

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });
271
Luciano Costa

誰かがルチアーノにこれらのポイントを与えます:)私は彼の答えをテストしました-同様の質問がありました-そして完璧に働いた...

50セントも追加します。

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })
81
frenetix

これが私の追加です。

http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html および 公式ソース から

jQuery 1.5で導入されたjqXHR.success()、jqXHR.error()、およびjqXHR.complete()コールバックメソッドは、jQuery 1.8で非推奨になりました。最終的に削除するためにコードを準備するには、代わりにjqXHR.done()、jqXHR.fail()、およびjqXHR.always()を使用します。 "

私はそれをしました、そしてここにルチアーノの更新されたコードスニペットがあります:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

エラーの説明に加えて、すべてのJSONデータを文字列として表示します。

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

アラートが気に入らない場合は、console.logに置き換えてください

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });
62
user2314737

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

GetJSON構造は次のとおりです( http://api.jqueri.com にあります):

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

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

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

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

ただし、成功関数にstatusおよびxhr変数を追加できます。ステータス変数には、「success」、「notmodified」、「error」、「timeout」、または「parsererror」の文字列のいずれかが含まれ、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");
    }         
});

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

これが、この質問に対する答えをまだ探している人の助けになることを願っています。

11
Tom Groentjes

私が読んだものからのエラーメソッドはないようです hereこの回答 良い説明を提供します

9
Ben Shelock
$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

JQuery 2.xで修正されています。 jQuery 1.xでは、エラーコールバックを取得することはありません

2
Pavlo O.

何故なの

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
    // ...
});

function getJSON(url,params,callback) {
    return $.getJSON(url,params,callback)
        .fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
            console.dir(jqXMLHttpRequest);
            alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
        })
}

使用される.fail()メソッド(jQuery 1.5+)の詳細については、 http://api.jquery.com/jQuery.ajax/#jqXHR を参照してください

jqXHRは関数によって返されるため、次のような連鎖

$.when(getJSON(...)).then(function() { ... });

可能です。

1
Blauhirn

この同じ問題に直面しましたが、失敗したリクエストのコールバックを作成するのではなく、jsonデータオブジェクトでエラーを返しました。

可能であれば、これが最も簡単な解決策のようです。これが、私が使用したPythonコードのサンプルです。 (Flaskのjsonify fとSQLAlchemyのFlaskを使用)

try:
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
    db.session.delete(snip)
    db.session.commit()
    return jsonify(success=True)
except Exception, e:
    logging.debug(e)
    return jsonify(error="Sorry, we couldn't delete that clip.")

次に、このようなJavascriptを確認できます。

$.getJSON('/ajax/deleteSnip/' + data_id,
    function(data){
    console.log(data);
    if (data.success === true) {
       console.log("successfully deleted snip");
       $('.snippet[data-id="' + data_id + '"]').slideUp();
    }
    else {
       //only shows if the data object was returned
    }
});
1
Nick Woodhams

場合によっては、この方法で同期の問題が発生する可能性があります。 setTimeout関数内にコールバック呼び出しを記述しましたが、同期的にうまく動作しました=)

例えば:

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

    setTimeout(function(){
        callback(data);
    },0);
}
0
Alex Alonso