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

Відповіді:


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все ще повертає Відкладене; можливо, з уже приєднаними зворотніми зворотними дзвінками.
користувач2246674

1
Ось він, jQuery 1.9, та успіх :, error :, і повна: все ще корисні. Однак моє запитання: чи .done () == до успіху:?
TARKUS

3
@GregoryLewis З JQuery 1.10 вихідного коду: jqXHR.success = jqXHR.done;.
Майкл Лаффарг

9
Я чесно вважаю за краще success, fail, always.
ahnbizcad

4
WOW, я також неправильно прочитав документацію. Я буквально подумав, що параметри "успіх" / "помилка" для $ .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
Чи є у вас якісь достовірні та перевірені посилання?
Пол Варгас

@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.
                });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.