Подтвердить что ты не робот

Выброс ошибки в jQuery Отложенный объект

У меня есть $.ajax обещание и хочу проверить, содержит ли мой (синтаксически правильный) ответ ошибку, вызывая отклоненный статус в этом случай.

Я работал с моей собственной библиотекой обещаний, которая легко справляется с такими задачами. Мне не очень нравится jQuery Promise (cache) с объектом Deferred и, возможно, что-то упустил, потому что я редко его использую. Я думаю, что путь - просто использовать .then(), что кажется довольно сложным:

return $.ajax(...).then(function success(response) {
    var problem = hasError(response);
    if (problem) {
        var error = new $.Deferred;
        error.reject(problem);
        return error;
    } else
        return response;
});

Это должно вернуть обещание, которое отклоняется в случае сетевых ошибок или проблем с ответом. Но возвращается ли отклоненный отложенный вариант [только | самый лучший] самый короткий путь?

Также я бы посоветовал помочь справиться с такими "обработчиками ответов об ошибках" в вариантах ajax, я не смог найти хорошую документацию о них.


Отказ от ответственности: Нет, я не могу изменить ответы сервера. Метод обнаружения проблемы является синхронным. Я не хочу использовать другие библиотеки, меня особенно интересует способ, которым jQuery решает это.

4b9b3361

Ответ 1

Теперь обновлено для jQuery 1.8 +

Самый простой способ справиться с этим - запустить отклик $.ajax через .then для фильтрации на основе успеха или сбоя данных.

$.ajax()
    .then(function (response) {
        return $.Deferred(function (deferred) {
            var problem = hasError(response);

            if (problem) {
                return deferred.reject(problem)
            }

            deferred.resolve(response);
        }).promise();
    });

Затем вы можете вернуть это новое обещание, если бы код вызова не использовал это:

var request = function () {
    return $.ajax()
        .then(function (response) {
            return $.Deferred(function (deferred) {
                var problem = hasError(response);

                if (problem) {
                    return deferred.reject(problem)
                }

                deferred.resolve(response);
            }).promise();
        });
};

request()
    .done(function (response) {
        // handle success
    })
    .fail(function (problem) {
        // handle failure
    });