成功とエラーの代わりに、新しいjQuery AJAXコードに.done()と.fail()を使用する必要がありますか


166

私はこのようにコーディングしました:

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID },
    success: function (data) {
        $('#CityID').html(data);
    },
    error: function (ajaxContext) {
        alert(ajaxContext.responseText)
    }
});

しかし、最後にjQuery .ajax()ドキュメントを見ると、以下のようにコーディングする必要があるか、少なくともa .done()とaを追加するように提案されているよう.fail()です。

var request = $.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
});

request.done(function (data) {
    xxx;
});
request.fail(function (jqXHR, textStatus) {
    xxx;
});

更新

私がこのようにコード化した場合、それは同じですか、それを3つに分割することにはいくつかの利点がありますか?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});

回答:


164

使用して、user2246674で述べたようにsuccessし、errorに、ajax関数のパラメーターとして、パラメーターとしてすることは有効です。

先例の答えと一致するように、ドキュメントを読んでください:

廃止のお知らせ

jqXHR.success()、jqXHR.error()、およびjqXHR.complete()コールバックは、jQuery 1.8で廃止される予定です。最終的な削除のためにコードを準備するには、代わりにjqXHR.done()、jqXHR.fail()、およびjqXHR.always()を使用します。

あなたは、使用する(例えばメソッド・チェーンを使用して)コールバック操作機能を使用している場合は.done().fail().always()の代わりにsuccess()error()complete()


54
同意しません。参照は、より普遍的なDeferredパターンのために廃止予定のコールバック操作関数.errorなど.success)について説明しますが、ajaxメソッドへのパラメーターは廃止されておらず、jQuery 1.9 / 2.0でも有効で受け入れ可能です!現在のすべてのフォームで、ajax依然としてDeferredを返します。すでに接続されているDeferredコールバックを使用している可能性があります。
user2246674 2013

1
ここでは、jQuery 1.9、success:、error:、complete:を引き続き使用できます。しかし、私の質問は、.done()==が成功するかどうかです。
TARKUS 2013年

3
jQueryの1.10ソースコードから@GregoryLewis: jqXHR.success = jqXHR.done;
Michael Laffargue 2013年

9
私は正直に好みますsuccessfailalways
ahnbizcad 2014

4
うわー、私もドキュメントを誤って読みました。$ .ajaxの「成功」/「エラー」オプションが「完了/失敗」に書き直されたと私は文字通り考えました。これは、コールバックメソッドチェーンだけでした。正直なところ、オプション名も入れ替えるべきだったと思います。それは私を何時間も悩ませました。
OzzyTheGiant

12

@Michael Laffargueの投稿に何かを追加したい:

jqXHR.done() 速いです!

jqXHR.success()コールバックにロード時間があり、スクリプトを過剰に実行することがあります。私は前にそれを難し​​い方法で見つけます。

更新:

使用してjqXHR.done()jqXHR.fail()そしてjqXHR.always()、あなたはより良いAJAXリクエストで操作することができます。一般的に、いくつかの変数またはオブジェクトでajaxを定義し、その変数またはオブジェクトをコードの任意の部分で使用して、データをより速く取得できます。良い例え:

/* Initialize some your AJAX function */
function call_ajax(attr){
    var settings=$.extend({
        call            : 'users',
        option          : 'list'
    }, attr );

    return $.ajax({
        type: "POST",
        url: "//exapmple.com//ajax.php",
        data: settings,
        cache : false
    });
}

/* .... Somewhere in your code ..... */

call_ajax({
    /* ... */
    id : 10,
    option : 'edit_user'
    change : {
          name : 'John Doe'
    }
    /* ... */
}).done(function(data){

    /* DO SOMETHING AWESOME */

});

9
信頼できる検証可能な参照がありますか?
Paul Vargas

@PaulVargas私はパフォーマンステストを一度も行っていませんが、実際にはこれが機能することがわかりました。ご自分でお試しいただけます。
Ivijan StefanStipić2017

1
信頼できる証拠を提供してください。
wonsuc 2018

ご存じのように、コールバック関数は、関数からいくつかのオブジェクトを返すのに比べて遅くなります。影響が小さい場合もありますが、通話数が多い場合は影響が大きくなることがあります。
Ivijan StefanStipić19年

7

簡単な言葉で

$.ajax("info.txt").done(function(data) {
  alert(data);
}).fail(function(data){
  alert("Try again champ!");
});

info.textを取得した場合、アラートと追加した関数、またはサーバーからinfo.textを取得できない場合は、アラートまたはエラー関数。


0

古い既存のアプリケーションでJQueryを1.xから2xまたは3.xに移行する場合は、JQueryの段階的変更がこれらのメソッドで非推奨になるため、success、errorではなく.done、.failを使用します。たとえば、サーバーのWebメソッドを呼び出すと、サーバーはpromiseオブジェクトを呼び出し側のメソッド(Ajaxメソッド)に返し、このpromiseオブジェクトには.done、.fail..etcメソッドが含まれています。したがって、成功と失敗の応答についても同じです。以下に例を示します(GETなどの要求タイプ用に構築できるのと同じ方法でPOST要求用です)。

 $.ajax({
            type: "POST",
            url: url,
            data: '{"name" :"sheo"}',
            contentType: "application/json; charset=utf-8",
            async: false,
            cache: false
            }).done(function (Response) {
                  //do something when get response            })
           .fail(function (Response) {
                    //do something when any error occurs.
                });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.