【问题标题】:jQuery Deferred: Rejecting a Promise from within a Done FilterjQuery Deferred:从完成过滤器中拒绝承诺
【发布时间】:2013-07-21 22:21:45
【问题描述】:

Fyi,我刚刚开始学习 jQuery Promise,所以在这里我可能会有些困惑。

无论如何,我有一个 AJAX 请求,我想根据响应的内容从完成的过滤器中拒绝它:

return doAJAXRequest().then(function (data) {
    if (data.responseText == "YES") {
        return doOtherAJAXRequest();
    } else {
        this.reject(data);
    }
});

这并没有像我预期的那样工作:

Uncaught TypeError: Object #<Object> has no method 'reject'

如何根据它的响应使这个 Promise 失败?那可能吗?还是我只是对这里需要做什么感到困惑?

【问题讨论】:

  • 尝试将 this.reject 更改为 $(this).reject。
  • @rtimoshenko 你确定这是对的吗?
  • @rtimoshenko 这似乎不起作用,我仍然遇到同样的错误。编辑:实际上它并不完全相同,但仍然非常相似。 (Uncaught TypeError: Object [object Object] has no method 'reject')
  • 我的错误,我看到了“this”并做了一个假设。您是否将您的代码与文档进行了比较? api.jquery.com/deferred.then 您可以尝试使用全局 $.Deferred().reject。这是一个 jsFiddle:jsfiddle.net/pgBCD
  • @rtimoshenko 好吧,这似乎可行:jsfiddle.net/pgBCD/1

标签: jquery jquery-deferred


【解决方案1】:

在 jQuery 中(与其他一些库不同),将 Promise 从“已解决”状态转换为“已拒绝”状态有点冗长,需要显式创建和拒绝新的 Deferred。

function foo() {
    return doAJAXRequest().then(function (data, textStatus, jqXHR) {
        if (data.responseText == "YES") {
            return doOtherAJAXRequest(data);
        } else {
            return $.Deferred().reject(jqXHR, data, 'Not YES').promise();
        }
    });
)

这里,如果data.responseText !== "YES" 模拟(部分)失败的 ajax 请求,则返回承诺,同时仍然允许传递 data。这(可能)对于下游 .fail() 处理程序很重要,它必须处理真正的 ajax 失败和变形的成功条件,直到它读取 errorThrown 才知道发生了哪一个。

foo().fail(function(jqXHR, textStatus, errorThrown) {
    if(errorThrown == 'Not YES') {
        //transmogrified success
        var data = textStatus;
        ...
    }
    else {
        //genuine ajax failure
        ...
    }
}); 

以这种方式传递data 通常比从jqXHR 对象重新获取它更容易。对于 JSON 编码的数据尤其如此,否则需要在失败处理程序中对其进行第二次解码。

【讨论】:

  • 我认为不需要 promise() 部分(或不再需要),这使得调用不那么难看/冗长。
猜你喜欢
  • 2016-07-08
  • 1970-01-01
  • 2019-09-12
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
相关资源
最近更新 更多