以下代碼片段使用jQuery的getJSON調用服務,沒有使用useJsonp
部分,長時間工作良好。然後,需要支持JSONP並添加了if (useJsonp)
條件。這也可以正常工作,直到HTTP請求失敗。當我使用404響應失敗時(使用Fiddler),沒有任何回調(調用.done
和.fail
)。當請求沒有失敗時,我得到.done
回調。jQuery:爲JSONP添加「回調」參數不會觸發回調
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();
};
這是爲什麼?我能做些什麼來使回調被稱爲?
感謝
WTH你在幹什麼呢? '.getJSON'已經返回一個promise,'$ .when()'已經返回一個promise,絕對沒有理由使用'$ .Deferred()'。只需'返回$ .getJSON(useJsonp?url +'&callback =?':url)'就夠了。 – Bergi
謝謝@Bergi - 我編輯了代碼來演示即使getJSON成功,我可能需要拒絕它。所以我可以調用'return $ .getJSON(...)',我需要做一些事情然後返回諾言。這個完整的代碼有點像這樣調用:'$ .when(getData(url))。done(...)。fail(...)'。 – Haji
好的,你仍然應該使用['then'](http://api.jquery.com/deferred.then/)(像[this](http://stackoverflow.com/q/10843297/1048572)),而不是[手動構建延遲](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#wiki-the-deferred-anti-pattern) – Bergi