jQuery Deferred:拒绝完成filter中的承诺

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

无论如何,我有一个AJAX请求,我想根据响应的内容在完成filter中拒绝:

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

这没有按照我的预期发挥作用:

 Uncaught TypeError: Object # has no method 'reject' 

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

在jQuery中(与其他一些lib不同),将一个从“已解决”状态转换为“已拒绝”状态的承诺略显冗长,需要显式创建和拒绝新的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 ,则返回data.responseText !== "YES" 。 这对于下游.fail()处理程序来说(可能)很重要,它必须处理真正的ajax失败和transmogrified成功条件,而不知道在读取errorThrown之前发生了哪一个。

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

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