我試着把握自己的承諾,它看起來很簡單。我把它們想象成異步變量。我需要解決的問題之一是做出幾個AJAX調用,這些調用都需要成功解決,將它們依次鏈接在一起,也就是我需要使它們同步以獲得結果。由於使ajax調用sync: false
已被棄用,我試圖使AJAX與promises同步。手動解析AJAX返回承諾
$.when(
ajaxCall(param1),
ajaxCall(param2)
).then(
function(data) {
console.log(['OK: ',data]);
}, function() {
console.log('Error');
}
).fail(function() {
console.log('Fail');
});
和AJAX調用函數定義爲:
ajaxCall: function ($id) {
$.ajax({
url: 'some_url'
type: 'POST',
dataType: "JSON",
data: packed,
success: function (data) {
var deferred = $.Deferred();
switch (data.code) {
case 200:
deferred.resolve(data);
break;
default:
deferred.reject(data);
break;
}
return deferred.promise();
},
error: function() {
$.Deferred().reject();
}
});
}
我直接做了一些假的AJAX調用,但從來沒有執行.fail分支,我不知道是什麼問題。 如果我將.then
更改爲.done
,則至少會執行錯誤回調,但不管我嘗試過什麼,我從未到達Fail分支。
解決方案可能很簡單,但看起來像我無法正確地制定問題找到解決我的問題。
所以我有樹的問題:
- 爲什麼
.fail
永遠不會被調用,而我需要做什麼改變,使其工作? - 我基本明白了
.done
和.then
之間的區別。當承諾解決時都會調用這兩個函數,只有.then
是可鏈接的,而不是(如果我是正確的)。.done
和.fail
通常配對成雙方都有一個回調,而.then
有兩個。由於我在.done
中使用了兩個回調函數,爲什麼第二個回調函數會被調用,因爲所有回調函數都是成功的回調函數? - 爲什麼拒絕不叫失敗分支?
任何幫助表示讚賞。
你的代碼和我的代碼很相似,除了我的兩個回調函數在'.then'塊中。 – Izzy