【发布时间】:2016-08-01 20:10:45
【问题描述】:
我试图抓住 promises 的头脑,它看起来很简单。我把它们想象成异步变量。我需要解决的问题之一是进行多个 AJAX 调用,所有这些调用都需要成功解决,将它们一个接一个地链接起来,也就是我需要使它们同步以获得结果。由于不推荐使用 ajax 调用 sync: false,因此我尝试使 AJAX 与 Promise 同步。
$.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,那么至少会执行Error 回调,但是无论我尝试什么,我都没有到达Fail 分支。
解决方案可能很简单,但看起来我无法正确地提出问题来找到我的问题的解决方案。
所以我有树问题:
- 为什么从未调用过
.fail,我需要进行哪些更改才能使其正常工作? - 我基本了解
.done和.then之间的区别。两者都在 promise 被解决时被调用,只有.then是可链接的,而 done 不是(如果我是正确的)。.done和.fail通常配对,因为它们都有一个回调,而.then有两个。由于我在.done中使用了两个回调,为什么调用第二个,因为 done 中的所有回调都是成功回调? - 为什么拒绝不调用失败分支?
感谢任何帮助。
【问题讨论】: