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'
如何根据响应失败?那可能吗?或者我只是对这里需要做什么感到困惑?
答案 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编码数据尤其如此,否则需要在失败处理程序中再次对其进行解码。