在jQuery的Deferred对象抛出一个错误在jQuery的Deferred对象抛出一个错误(T

2019-05-16 20:17发布

我有一个$.ajax承诺,要检查我的(语法上有效的)响应是否包含一个错误,引发在这种情况下拒收状态。

我有我自己的诺言库,很容易涉及此类任务的工作。 我真的不喜欢jQuery的承诺 ( 高速缓存 )及其实施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;
});

这应返回它在网络错误或问题的响应的情况下,拒绝承诺。 但返回一个拒绝延期真的[只|最好|最短]的路要走?

我还要对并欣赏如何处理在阿贾克斯选项themselfes这样的“错误抛出的响应处理程序”的帮助下,我找不到任何有关他们良好的文档。


免责声明:不,我不能改变服务器的响应。 检测问题的方法是同步的。 我不想用到其他库,我在jQuery的解决这个问题的方法特别感兴趣。

Answer 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
    });


文章来源: Throwing an Error in jQuery's Deferred object