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

前端之家收集整理的这篇文章主要介绍了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'

根据回应,我如何使这个承诺失败?那可能吗?或者我只是困惑在这里需要做什么?

解决方法

在jQuery中(与其他一些libs不同),将“解决”状态的承诺转变为“被拒绝”状态是一个冗长的细节,需要明确地创建和拒绝新的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请求,同时仍然允许数据传递,则返回。这对于下游的.fail()处理程序来说很重要,它必须处理两个真正的ajax失败和转换成功条件,而不用知道哪一个发生,直到它读取errorThrown。

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

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

猜你在找的jQuery相关文章