jQuery Deferred:拒绝完成过滤器中的承诺

时间:2013-07-23 01:37:52

标签: jquery jquery-deferred

Fyi,我刚刚开始学习jQuery的承诺,所以我在这里可能有点困惑。

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

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

这不符合我的预期:

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

如何根据响应失败?那可能吗?或者我只是对这里需要做什么感到困惑?

1 个答案:

答案 0 :(得分:32)

在jQuery(与其他一些libs不同)中,通过“已解决的”来转化承诺。声明拒绝&#39; state略显冗长,需要明确创建和拒绝新的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编码数据尤其如此,否则需要在失败处理程序中再次对其进行解码。