Виклик jquery ajax - .fail vs.: error


77

Який із них мені використовувати?

Чи є якась причина використовувати одну, а не іншу?

Чи найкращий для обробки помилок?

$.ajax({
    url: url,
    data: { start: start, end: end }
}).done(function(data, textStatus, jqXHR) {
    $('#myElement').append(data);
}).fail(function() {
    // report error    
});

АБО

$.ajax({
    url: url,
    data: { start: start, end: end },
    success: function(data, textStatus, jqXHR) {
        $('#myElement').append(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        // report error
    }
});

Відповіді:


43

Два варіанти рівнозначні.

Однак інтерфейс у стилі обіцянки ( .fail()і .done()) дозволяє відокремити код, що створює запит, від коду, який обробляє відповідь.

Ви можете написати функцію, яка надсилає запит AJAX і повертає об'єкт jqXHR, а потім викликати цю функцію в іншому місці та додати обробник.

У поєднанні з .pipe()функцією інтерфейс обіцяного стилю також може допомогти зменшити вкладеність під час здійснення декількох викликів AJAX:

$.ajax(...)
    .pipe(function() { 
        return $.ajax(...);
    })
    .pipe(function() { 
        return $.ajax(...);
    })
    .pipe(function() { 
        return $.ajax(...);
    });

34
"Починаючи з jQuery 1.8, метод deferred.pipe () застарілий. Натомість слід використовувати метод deferred.then (), який його замінює." api.jquery.com/deferred.pipe
richardaday

31

Просто щоб освіжити це ...

Підхід до успіху та помилок застарілий із jQuery 1.8.

jQuery Ajax

Повідомлення про застарілість: Зворотні виклики jqXHR.success (), jqXHR.error () та jqXHR.complete () застаріли станом на jQuery 1.8. Щоб підготувати свій код до їх остаточного видалення, використовуйте jqXHR.done (), jqXHR.fail () та jqXHR.always ().


10
Це на самому ділі старіння з error()на jqXHRоб'єкт, а НЕ $.ajaxсам, який є те , що користувач має в увазі.
Адам Грант

1
@AdamGrant, $.ajax повертає a jqXHR, тому @slohr правильний.
Concrete Gannet

8
Ти маєш рацію. Мені слід переформулювати свій коментар, припинення дії successта errorне застосовуватись до функцій об’єктного рівня, переданих$.ajax()
Адам Грант,

2
Витратив на це кілька годин, і так, я виявив, що застаріння стосується методів, а НЕ варіантів, на які ви переходите $.ajax().
adi518

3

Використання стилю обіцяного відкладеного об’єкта дозволяє отримати чистішу структуру та використовувати завжди .

let data = {"key":"value"}

$.ajax({
    type: 'PUT',
    url: 'http://example.com/api',
    contentType: 'application/json',
    data: JSON.stringify(data), 
}).done(function () {
    console.log('SUCCESS');
}).fail(function (msg) {
    console.log('FAIL');
}).always(function (msg) {
    console.log('ALWAYS');
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.