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