Должен ли я использовать .done () и .fail () для нового кода JQuery AJAX вместо успеха и ошибки

167

Я закодировал так:

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

Но когда я смотрю на .ajax()документацию jQuery в конце, мне кажется, что мне следует кодировать, как показано ниже, или, по крайней мере, предлагать добавить 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;
});

Обновить

Если я кодирую так, это то же самое или есть какое-то преимущество, если разбить его на три части?

$.ajax({ cache: false,
    url: "/Admin/Contents/GetData",
    data: { accountID: AccountID }
}).done(function (data) {
    xxx;
}).fail(function (jqXHR, textStatus) {
    xxx;
});
alan2
источник

Ответы:

165

Как указано 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
Я не согласен. Упоминания говорят о функциях обратного вызова манипуляции (например .error, .success) , которые являются устаревшими в пользу более универсального отсроченного рисунок, но и параметры к ajaxметоде не рекомендуются и являются действительными и приемлемым - даже в Jquery 1,9 / 2,0! Во всех текущих формах по- ajaxпрежнему возвращает отложенное; возможно с уже прикрепленными отложенными обратными вызовами.
user2246674
1
Здесь, jQuery 1.9 и success :, error: и complete: все еще можно использовать. Однако мой вопрос заключается в том, является ли .done () == к успеху:?
ТАРКУС
3
@GregoryLewis Из JQuery 1.10 исходного кода: jqXHR.success = jqXHR.done;.
Майкл Лаффарг
9
Я честно предпочитаю success, fail, always.
Анбизкад
4
Ух ты, я неправильно прочитал документацию. Я буквально думал, что опции «success» / «error» для $ .ajax были переписаны как «done / fail». Это были просто цепочки методов обратного вызова. Честно говоря, я думаю, что они должны были также поменять названия опций. Это поставило меня в тупик на несколько часов.
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
Есть ли у вас достоверные и проверяемые ссылки?
Пол Варгас
@PaulVargas Я никогда не делаю тест производительности, но на практике я считаю, что это работает. Вы можете попробовать сами.
Ивиян Стефан Стипич
1
Пожалуйста, предоставьте любые доказательства, которые заслуживают доверия.
Wonsuc
Как вы знаете, функции обратного вызова медленнее по сравнению с возвратом некоторых объектов из функции. Иногда это небольшое влияние, но иногда может быть огромным, если у вас много вызовов.
Ивиян Стефан Стипич
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 в нашем старом существующем приложении, мы будем использовать .done, .fail вместо успеха, ошибка, поскольку градация JQuery up будет устаревшей для этих методов. Например, когда мы выполняем вызов веб-методов сервера, сервер возвращает объекты обещания вызывающим методам (методы Ajax), и эти объекты обещания содержат методы .done, .fail..etc. Поэтому мы будем одинаковыми для ответа об успешном и неудачном завершении. Ниже приведен пример (это для запроса POST таким же образом, как мы можем построить для типа запроса, как GET ...)

 $.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.
                });
Шео Дайал Сингх
источник