web-dev-qa-db-ja.com

jQuery:失敗したAJAX Requestのフォールバックを処理する

JQueryは失敗したAJAX呼び出しのフォールバックを提供できますか?これは私の試みです:

function update() {
    var requestOK = false;

    $.getJSON(url, function(){
        alert('request successful');
        requestOK = true;
    });

    if (!requestOK) {
        alert('request failed');
    }
}

残念ながら、たとえ$ .getJSON()メソッドのコールバック関数が呼び出されたとしても、コールバック関数がrequestOK変数を設定する機会を得る前に、メッセージ 'request failed'を取得します。コードが並行して実行されるためだと思います。そのような状況に対処する方法はありますか?チェーンまたは、コールバック関数を含むAJAXリクエストを待機する何らかの方法について考えました。しかし、どのように?誰もそれを行う方法を知っていますか?

37
Patrick Oscity

下位レベルの $。ajax 呼び出し、または ajaxError 関数を使用する必要があります。以下に、$。ajaxメソッドを使用します。

function update() {
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000,
    success: function(data, textStatus ){
       alert('request successful');
    },
    fail: function(xhr, textStatus, errorThrown){
       alert('request failed');
    }
  });
}

[〜#〜] edit [〜#〜]timeout$.ajax呼び出しに追加して、 5秒。

75
Doug Neiner

Dougsの答えは正しいですが、実際には$.getJSONを使用してエラーをキャッチできます($.ajaxを使用する必要はありません)。 getJSON呼び出しをfail関数の呼び出しにチェーンするだけです:

$.getJSON('/foo/bar.json')
    .done(function() { alert('request successful'); })
    .fail(function() { alert('request failed'); });

ライブデモ: http://jsfiddle.net/NLDYf/5/

この動作はjQuery.Deferredインターフェイスの一部です。
基本的に、イベントを非同期アクションafterにアタッチすることができます。つまり、アクションを呼び出す必要はありません。アクションに対するイベント関数。

JQuery.Deferredの詳細については、こちらをご覧ください。 http://api.jquery.com/category/deferred-object/

はい、jQueryに組み込まれています。 jquery documentation のドキュメントを参照してください。

ajaxErrorはあなたが望むものかもしれません。

2
Jonathon Faust

Promiseを返して.then(successFunction、failFunction);を使用できるため、このアプローチの方が好きです。必要な場所に。

var promise = $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    timeout: 5000
  }).then(function( data, textStatus, jqXHR ) {
    alert('request successful');
  }, function( jqXHR, textStatus, errorThrown ) {
    alert('request failed');
});

//also access the success and fail using variable
promise.then(successFunction, failFunction);
1
thebaron24

あなたが探しているのはjquery ajax object のエラーオプションだと思います

getJSONは$.ajaxオブジェクトのラッパーですが、エラーオプションへのアクセスは提供しません。

編集:dcneinerは、使用する必要があるコードの良い例を示しています。 (返信を投稿する前に)

1
Sean Vieira