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


192

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



アジェイ、正解をマークすることを考えてみませんか?
IonicăBizău

@IonicăBizăuは今それをマークしました。しばらくこのことを忘れてしまいました。一番の答えはJSONPについて話しているのではありません。ベンShelockによってとがっているように、何のサポートエラーハンドラが..私は信じていることはありません
アジャイ

回答:


277

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

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

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

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

いいえ!あなたはそこに好きなように行くことができます。詳細なヘルプについては、ドキュメントをご覧ください。http
Luciano Costa

5
これにはjQuery 1.5+が必要であることに注意してください(jQuery 1.3でそれを機能させようとしていて、なぜ無効なメソッドについて不平を言っているのか疑問に思いました:-)
kenyee

24
OPがクロスサイトについて具体的に尋ねJSONPているのはgetJSON、そのような場合はerror()関数を呼び出さないように思われるためです。私も同じ問題を抱えています。両方を処理しているにもかかわらずJSONP、通常のAJAX呼び出しとはまったく異なる方法で処理されることに関係していると思います。行われたオブジェクトが、動的に追加することによって行われるページのにタグを。jQuerygetJSONJSONXMLHTTPRequestJSONP<script>HEAD
ヒッピートレイル

3
jQuery Docは、「注:このハンドラーは、クロスドメインスクリプトとJSONPリクエストでは呼び出されません」と述べています。api.jquery.com/jQuery.ajax >エラー
OneWorld

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

86

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

私も50セントを追加します。

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

3
これはクロスサイトJSONPと同じですか、それとも同じサイトJSONを使用していましたか?
ヒッピートレイル

28
素敵な答え!.errorについてのメモ:jQuery 1.8では非推奨になるため、.failを
Anatoly Mironov

73

これが私の追加です。

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

完了、失敗、常に、およびgetJSON内のコードの発生順を教えてください。
TheLogicGuy

注:console.logは、IE7のような古いブラウザーには実装されていません。万が一に備えて!
MadMad666 2017年

12

誰かがここで答えたのは久しぶりで、ポスターはおそらくここまたはどこかからすでに彼の答えを得ています。ただし、この投稿は、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 varを使用してJSONデータへのリンクを提供し、datatosendを追加する場所として "?callback=?"は、正しいJSONデータを取得するために送信する必要がある変数およびその他の変数として、データを処理するための関数として成功関数を使用します。

ただし、success関数にstatusおよびxhr変数を追加できます。状態変数は、以下のいずれかの文字列が含まれています:「成功」、「notmodified」、「エラー」、「タイムアウト」、または「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");
    }         
});

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

これがまだこの質問への答えを探している誰かを助けることを願っています。


2
これは機能しません。「成功」コールバックは、その名前が示すように、成功した場合にのみ呼び出されます。(「ステータス」パラメータの
意味がわかりませ

4

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

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


1

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

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

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

これはサーバー内で発生するエラーには問題ありませんが、呼び出しがサーバーに到達できない場合や、MVCユーザーが認証されなくなった場合など、サーバーコードに到達する前にエラーがスローされた場合はキャプチャしません。
Lee Oades 2017年

1

何故なの

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() { ... });

可能です。


0

場合によっては、このメソッドとの同期の問題が発生することがあります。私は内部にコールバック呼び出しを書きましたsetTimeout関数、同期的にうまく機能しました=)

例えば:

function obterJson(callback) {


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

    setTimeout(function(){
        callback(data);
    },0);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.