在 jQuery 的 Deferred 对象中抛出错误

IT技术 javascript error-handling jquery-deferred promise
2021-03-11 01:56:01

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

我使用过自己的 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;
});

这应该返回一个Promise,在网络错误或响应问题的情况下被拒绝。但是返回一个被拒绝的 deferred 真的是 [only|best|shortest] 方法吗?

我也会在如何处理 ajax 选项本身中的此类“错误抛出响应处理程序”方面提供帮助,但我找不到关于它们的良好文档。


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

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

然后,您可以将这个新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
    });
pipe允许您在将延迟值发送到任何已注册的Promise处理程序之前对其进行过滤。then实际上只是用于在Promise解决或拒绝时注册处理程序。
2021-04-16 01:56:01
jQuery Deferreds 不符合 Promises/A。它们是 Promises/A 和“Promises/J” jaubourg.net/38261410 的派生
2021-04-22 01:56:01
不,根据规范.then() 会做到这一点。或者 jQuery 是否抛出了这个并交换了方法名称?
2021-04-24 01:56:01
嗯,很高兴知道。明天我会通读那篇文章。
2021-05-07 01:56:01
pipe 和 then 有什么区别?
2021-05-09 01:56:01