25

仅供参考,我刚刚开始学习 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'

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

4

1 回答 1

36

在 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 编码数据尤其如此,否则需要在失败处理程序中对其进行第二次解码。

于 2013-07-24T17:04:16.937 回答