我试图抓住承诺,看起来很简单。我把它们想象成异步变量。我需要解决的一个问题是进行几个AJAX调用,这些调用都需要成功解决,一个接一个地链接它们,我还需要让它们同步以获得结果。由于不推荐使用ajax调用sync: false
,我试图使AJAX与promises同步。
$.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
,为了让它起作用我需要改变什么? .done
和.then
之间的区别。当承诺得到解决时,两者都会被调用,只有.then
可以链接而不完成(如果我正确的话)。 .done
和.fail
通常配对,因为它们都有一个回调,.then
有两个回调。因为我在.done
中使用了两个回调,为什么第二个被调用,因为所有回调都是成功回调?感谢任何帮助。
答案 0 :(得分:0)
您可以执行以下操作
var ajaxCall= function ($id) {
return $.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();
}
});
};
var successCall= function(){
// code after both request completed with success;
};
var failureCall= function(){
// code after both request completed and if have error
};
$.when(ajaxCall(param1),ajaxCall(param2))
.then( successCall, myFailure );
我还没有测试过但是我在例子部分https://api.jquery.com/jquery.when/
中的描述末尾的jQuery文档中读到了这种代码当两个ajax请求成功时执行函数myFunc,或者 myFailure,如果其中一个有错误。
$。when($ .ajax(“/ page1.php”),$ .ajax(“/ page2.php”))。then(myFunc,myFailure);