web-dev-qa-db-ja.com

AJAX=リクエストがjQueryで成功したかどうかを確認する最良の方法

私はAJAXリクエストが次のようなことで成功することを確認しています:

$.post("page.php", {data: stuff}, function(data, status) {
    if(status == "success") {
        //Code here
    }
    else {
        //Error handling stuff
    }
});

ステータス変数をチェックすることは、これを実行するための最良の方法ですか、それともリクエストが実際に通過したことを確認するためのより良い方法がありますか?私は「成功した」リクエストをタイムアウトせずに投稿しているページにヒットするリクエストであると考えています(サーバーがダウンしていて、AJAXリクエストがその直前に行われた場合)例としてダウンしました)、またはあらゆる種類の404または500エラーを返します。

15
Aaron

このように_$.post_を呼び出すと、_success handler_関数のみが自動的に渡されます。

リクエストのどこかに問題があった場合、このメソッドは実行されません。

より細かく制御するには、$.ajax()を直接使用するか、失敗ハンドラを渡します。それは次のようになります

_$.post("page.php", {data: stuff}, function(data, status) {
   // we're fine here
}).fail(function(err, status) {
   // something went wrong, check err and status
});
_

.ajax()を使用した同じこと:

_$.ajax({
   type: 'POST',
   url: 'page.php',
   data: stuff,
   success: function( data ) {
   },
   error: function(xhr, status, error) {
      // check status && error
   },
   dataType: 'text'
});
_

さらに、beforeSendでXHRヘッダーを変更/読み取るための_$.ajax_にajaxイベントハンドラーを渡したり、completeでハンドラーが発生したときにエラー(エラーかどうか)を発生させることができます。リクエストが終了しました。

30
jAndy

明示的な成功ハンドラーがあるため、ajax呼び出しを使用することを好みます

$.ajax({
url: "page.php",
data: stuff,
success: function(response){
console.log("success");
}
});

また、firebugまたはwebkitと同様のものを使用することをお勧めします。そうすれば、リクエストを追跡してパラメーターを確認できます。

2
Andrew Dover

もちろん、jQueryは、ソースコードのように「成功」​​と見なします。この場合、ステータスコードが返されないため、ステータスコード404/500もタイムアウトも含まれません。

いつ"success"を返すかを確認できます。

// If successful, handle type chaining
if ( status >= 200 && status < 300 || status === 304 ) {

...
    // If not modified
    if ( status === 304 ) {

        statusText = "notmodified";
...

    // If we have data
    } else {

        try {
...
            statusText = "success"; // So: only when status code is in
                                    // the range 200 <= x < 300
...
        } catch(e) {
...
            statusText = "parsererror";
...
        }
    }
1
pimvdb