13

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

我使用过我自己的 Promise 库,它可以轻松处理此类任务。我不太喜欢 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 解决这个问题的方式特别感兴趣。

4

1 回答 1

33

现在更新为 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
    });
于 2012-06-01T01:35:35.437 回答