【问题标题】:Throwing an Error in jQuery's Deferred object在 jQuery 的 Deferred 对象中引发错误
【发布时间】:2012-06-06 06:47:03
【问题描述】:

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

我使用过我自己的 Promise 库,它可以轻松处理此类任务。我不太喜欢 jQuery 的 Promise (cache) 实现及其 Deferred object 并且可能忽略了一些东西,因为我很少使用它。我认为要走的路就是使用.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;
});

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

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


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

【问题讨论】:

  • 好的,.then() 我的意思是 .pipe() 在 jQuery 中所做的事情 :-(
  • 同意!我只能想象如果 JQuery 决定坚持使用非标准规范,我们将面临不同的承诺消耗库的痛苦世界!感谢他们做出了重大改变,以便让我们免于遭受任何痛苦。

标签: javascript error-handling jquery-deferred promise


【解决方案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
    });

【讨论】:

  • pipe和then有什么区别?
  • pipe 允许您在将延迟的值发送到任何已注册的承诺处理程序之前过滤它们。 then 实际上只是用于在 promise 解析或拒绝时注册处理程序。
  • 不,by specification .then() 正是这样做的。还是 jQuery 抛出了这个并交换了方法名?
  • jQuery Deferreds 不符合 Promises/A。它们是 Promises/A 和“Promises/J”jaubourg.net/38261410 的派生。
  • 嗯,很高兴知道。我明天会通读那篇文章。
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多