Обработка ошибок и восстановление с помощью jQuery Deferred

Я использую jQuery и знаю, что эта проблема связана с тем, что реализация jQuery.Deferred не совместима с Promises/A+. Я не хочу использовать какие-либо другие библиотеки для решения этой проблемы.

Учитывая это, есть ли способ восстановиться после обратного вызова $.Deferred().fail(), чтобы я вернулся обратно в цепочку успеха? Это возможно с формой многократного обратного вызова then(), но пока я не нашел решения с использованием .fail()

тогда:

asyncThatWillFail().then(function () {
    // useless callback
}, function () {
    console.log("error");
    return $.Deferred().resolve();
}).then(function () {
    console.log("continuing on success chain");
});

сбой (не работает):

asyncThatWillFail().fail(function () {
    console.log("error");
    return $.Deferred().resolve();
}).then(function () {
    console.log("continuing on success chain");
});

В моем случае мне нужно только проверить наличие ошибки, установить флаг и продолжить то, что я делал. Мне просто не нужен параллельный обработчик успеха в примере «затем».

Вот jsFiddle, чтобы уточнить, что я имею в виду.


person thedarklord47    schedule 24.02.2016    source источник


Ответы (1)


Нет, для этого нельзя использовать .fail. Однако вам не нужно передавать функцию в качестве первого аргумента .then:

аргументы могут быть null, если обратный вызов этого типа не требуется.

Поскольку только then включает цепочку, вы должны использовать

asyncThatWillFail().then(null, function () {
    console.log("error");
    return $.Deferred().resolve();
}).then(function () {
    console.log("continuing on success chain");
});

Помимо необходимости возвращать выполненное обещание jQuery, это точно так же, как метод ES6 then, где catch является синонимом .then(null, …).

person Bergi    schedule 24.02.2016