我的脚本中有2个Ajax调用,每个调用都有不同的回调来执行调用成功。
ReadLink*Actions
我有另一个函数Action
,我希望在所有ajax调用返回后激活,但我不希望回调($.ajax({
type: 'POST',
url: "url1",
success: foo1
});
$.ajax({
type: 'POST',
url: "url2",
success: foo2
});
和Clear()
)将是执行直到我执行foo1
。
我已经找到了答案,但没有找到答案。我可以做些什么来解决这个问题?是否有任何旗帜或功能处理这类问题? 提前谢谢。
答案 0 :(得分:0)
我不确定我是否同意这些现有解决方案,因为JQuery为我们提供了一个工具:$.when
https://api.jquery.com/jquery.when/
使用$.when
时,JQuery会将所有承诺聚合到一个承诺中,并且只有在所有承诺解决后才能解决。如果任何承诺被拒绝,则会调用fail
。
const promise1 = $.Deferred();
const promise2 = $.Deferred();
promise1.resolve({data: 'Promise 1'});
promise2.resolve({data: 'Promise 2'});
$.when.apply(this, [promise1, promise2])
.done((promise1Data, promise2Data) => {
// All of our promises have resolved
// And we have all our data from each promise
// Do the work of clear() here
console.log(promise1Data.data)
console.log(promise2Data.data)
})
.fail((error) => {
console.error('One or more promises failed')
});
正如我们所看到的,在这个问题的上下文中,你可以在done
的{{1}}内做任何必要的逻辑。如果达到这一点,就可以保证所有承诺都已得到解决。
上面的代码块将以下内容输出到控制台
$.when
答案 1 :(得分:-1)
如下所示,您可以实施一个简单易用的解决方案,或者如果您需要更强大的解决方案,请查看JS Promises。
var foo1Data, foo2Data;
$.ajax({
type: 'POST',
url: "url1",
success: function(data) {
if (foo2Data) {
Clear();
foo1(data);
foo2(foo2Data);
}
else {
foo1Data = data;
}
}
});
$.ajax({
type: 'POST',
url: "url2",
success: function(data) {
if (foo1Data) {
Clear();
foo1(foo1Data);
foo2(data);
}
else {
foo2Data = data;
}
}
});
答案 2 :(得分:-1)
未经测试,但您可以使用when
尝试使用此类内容。
// each object in responses contains the response text,
// status, and jqXHR object for each ajax call
function clear(responses) {
// do something
foo1(responses[0]);
foo2(responses[1]);
};
$.when(ajax1, ajax2).done(clear);