当多个asyc调用完成时,AJAX启动最后一个asic调用
AJAX launch final asyc call when multiple asyc calls are complete
我正在考虑如何更好地管理运行多个异步调用的顺序,以获得最佳的周转时间。基本上流程如下:当网页开始加载时,它会显示页面并启动几个AJAX调用a()、b()和c()。这三个都完成后,运行异步调用d()。当满足两个条件时,我检查了几个像jquery execute函数这样的线程,但这并不完全相同。
我尝试使用多个标志来显示异步调用是否完成,并使用一个块函数来阻止进程,直到可以进行最后一次调用。
var aFinished=false;
function a() {
var jsonData = $.ajax({
url: "${createLink(controller:'environment', action:'a')}",
dataType: "json",
async: true
}).done(function(jsonData) {
//do something
aFinished=true;
});
}
//same flag+function for b() and c()
function d(){
blockTillAllDone();
var jsonData=$.ajax(...).done(...);
}
function blockTillAllDone(){
if(aFinished&&bFinished&&cFinished){
console.log("Ok to continue");
return;
}
else{
console.log("Have to wait");
setTimeout(blockTillAllDone(),2000);
}
}
a();b();c();d();
由于递归块函数导致堆栈不断增长,因此性能并不是很好。有人有更好的想法吗?如何用更AJAX的方式而不是暴力块函数来实现这一点?提前感谢!
您正在寻找承诺。
这篇文章很好地解释了基础知识。虽然许多浏览器现在都在原生地支持它们(除了IE),但您仍然希望包含一个类似于es-6的polyfill承诺。一旦你开始使用承诺,你就可以通过以下方式解决问题:
var a = new Promise(function(resolve,reject){
$.ajax({
type: 'GET',
dataType: 'json',
url: 'example.com/test/1',
success: function(response){resolve(response);},
error: function(response){reject(response);}
});
});
var b = new Promise(function(resolve,reject){
$.ajax({
type: 'GET',
dataType: 'json',
url: 'example.com/test/1',
success: function(response){resolve(response);},
error: function(response){reject(response);}
});
});
var c = new Promise(function(resolve,reject){
$.ajax({
type: 'GET',
dataType: 'json',
url: 'example.com/test/1',
success: function(response){resolve(response);},
error: function(response){reject(response);}
});
});
//This will run once all async operations have successfully finished
Promise.all([a,b,c]).then(
function(data){
//everything successful, handle data here
displayData(data);
},
function(data){
//something failed, handle error here
logoutError(data);
}
);
将检查移到d()中,并调用a、b和c 的done(..)
(除非您希望它在上发生,无论它是否成功-在这种情况下使用always(..)
)
var aFinished=false;
function a() {
var jsonData = $.ajax({
url: "${createLink(controller:'environment', action:'a')}",
dataType: "json",
async: true
}).done(function(jsonData) {
//do something
aFinished=true;
d();
});
}
//same flag+function for b() and c()
function d(){
if(aFinished&&bFinished&&cFinished){
var jsonData=$.ajax(...).done(...);
}
}
a();b();c();
那么就不需要blockTillAllDone
或setTimeout
您可以尝试基于事件的方法。将方法a()
、b()
和c()
放在一个类中,如果这三个方法都完成了,则每次检查都完成,如果完成,则引发一个将由侦听器捕获的事件,然后它可以执行d()
我将尝试使用代码演示这一点
相关文章:
- 阻止在select2单击时调用ajax
- 调用Ajax并返回响应
- Ajax:只在元素存在的情况下调用Ajax
- PHP,MySQL,AJAX-调用AJAX结果后,Bootstrap CSS样式不会显示
- 调用Ajax内部的函数
- 无法获取属性'的值;拆分'在IE8中调用ajax之后
- 我们如何在Firefox中调用AJAX
- Rails:通过调用Ajax重定向
- Cookie 在 Spotify (Javascript) 中调用 ajax 后未保存
- 通过调用 Ajax 来设置 struts bean 值
- 无法从服务器中的 php 调用 Ajax 函数
- 如何在附加表行时调用 ajax
- 在facebook用户发送邀请请求后调用ajax调用
- 定期调用Ajax
- 调用Ajax生成的表单的值
- 无法调用ajax函数
- 在调用AJAX之后显示ng控制器的内容;作为“;作用
- CSS,Java脚本在php中调用ajax后无法正常工作
- 成功调用AJAX后,Toast Growl不会出现
- 如何在调用AJAX时记录或捕获信息和错误