2009-12-04 109 views
29

jQueryは失敗したAJAXコールのフォールバックを提供できますか?これは私の試みです:残念ながら、jQuery:失敗したAJAXリクエストに対するフォールバックの処理

function update() { 
    var requestOK = false; 

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

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

場合でも、コールバック関数がrequestOKを設定する機会を持って前に方法は、私は、「失敗した要求」メッセージを取得すると呼ばれる$ .getJSON()のコールバック関数変数。コードは並行して実行されるためだと思います。このような状況に対処する方法はありますか?私は連鎖やAJAXリクエストを待つ何らかの方法(コールバック関数など)について考えました。しかしどうですか?誰もそれを行う方法を知っていますか?

答えて

61

$.ajaxコールを使用するか、ajaxError機能を使用する必要があります。ここでは、$アヤックスの方法である:

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

EDIT私は$.ajaxコールにtimeoutを加え、5秒に設定します。

+0

既に素晴らしいです!しかし、インターネット接続がダウンしているとうまくいかないようです。(それはかなり重要です。私はosx用のダッシュボードウィジェットを開発していて、リクエストができなかったというメッセージを表示したいからです。他のヒント? –

+0

@Patrick、私は 'timeout'パラメータを含めるように答えを更新しました。インターネット接続が切断された場合、5秒後にエラー機能を呼び出す必要があります。 –

+1

ありがとうございました! –

1

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

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

0

私は、あなたが探していることはjqueryのajax object

getJSONが$.ajaxオブジェクトのラッパーであるが、それは誤りオプションへのアクセスを提供していないため、エラーの選択肢であると信じています。

EDIT: dcneinerは、使用する必要があるコードの良い例を示しています。

+0

getJSONがエラーにアクセスできないことについて間違っています。エラーオプションには、getJSON呼び出しを連鎖させる形式でアクセスできます。 @Lasse Dahl Ebertの答えを見てください。 – Fydo

+1

@Fydo - この答えは実際には1年以上前に* jQueryの遅延されました;-)当時、エラーにアクセスする方法があったので、 '$ .ajax'メソッドに落としてください。 –

8

ダグの回答は正しいですが、実際には$.getJSONを使用してエラーをキャッチします($.ajaxを使用する必要はありません)。

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

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

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

ここjQuery.Deferredについて詳しく読む:http://api.jquery.com/category/deferred-object/

+1

'.error()'はjQuery v1.8から廃止され、 '.fail()'を使うべきです。 – Cobby

+0

ありがとうございます。私はそれを訂正した。 –

0

あなたが約束を返し、(successFunction、failFunction)を.then使用することができますので、私はこのアプローチを好みます。あなたが必要とするどこでも。

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); 
関連する問題