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