我试着把握自己的承诺,它看起来很简单。我把它们想象成异步变量。我需要解决的问题之一是做出几个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