【发布时间】:2014-04-03 09:41:45
【问题描述】:
以下代码使用 jQuery 的 getJSON 调用服务,没有useJsonp 部分,对我来说很长一段时间都可以正常工作。然后,需要支持 JSONP,并添加了if (useJsonp) 条件。这也可以正常工作,直到 HTTP 请求失败。当我以 404 响应失败(使用 Fiddler)时,没有回调(.done 和 .fail 被调用)。当请求没有失败时,我会得到.done 回调。
function getData(url){
var dfd = $.Deferred();
if (useJsonp) {
url += '&callback=?';
}
$.when($.getJSON(url))
.done(function (dataObj) {
if (!dataObj || dataObj.Status === 'failed') {
dfd.reject(dataObj);
}
else {
doSomething(dataObj);
dfd.resolve(dataObj);
}
})
.fail(function (jqXHR) {
dfd.reject(jqXHR);
});
return dfd.promise();
};
这是为什么呢?我该怎么做才能调用回调?
谢谢
【问题讨论】:
-
你在那儿干吗?
$.getJSON已经返回了一个承诺,$.when()已经返回了一个承诺,绝对没有理由使用$.Deferred()。只需return $.getJSON(useJsonp?url+'&callback=?':url)就足够了。 -
感谢@Bergi - 我编辑了代码以证明即使 getJSON 成功,我也可能需要拒绝它。所以我可以打电话给
return $.getJSON(...),我需要做点什么,然后返回承诺。整个代码的调用方式有点像这样:$.when(getData(url)).done(...).fail(...). -
好的,你仍然应该使用
then(如this),而不是manually constructing deferreds
标签: javascript jquery ajax jsonp promise