多ajax请求的各类解决方案(同步,队列,cancel请求)
2023-06-13 09:14:33 时间
•多个ajax请求同时发送,相互无依赖。
•多个ajax请求相互依赖,必须有先后顺序。
•多个请求被同时发送,只需要最后一个请求。
第1种case
应用场景:这个场景很多,一个页面打开是多个区域同时请求后台得到各自的数据,没依赖,没顺序。
处理方案:直接用jquery的ajax函数。这个用的非常多,这里从略,可看后面的代码中例子。
第2种case
应用场景:多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果。例如:用户登录后我们发送一次请求得到用户的应用ID,然后利用应用ID发送一次请求得到具体的应用内容(例子虽然不是太恰当,但基本就是这个意思了)。
处理方法:
1.利用ajax参数async设置为false,进行同步操作。(这个方法只适合同域操作,跨域需使用下面两种方法)
2.利用ajax嵌套(这个同第1种情况)
3.利用队列进行操作
jqueryajax队列操作核心代码:
复制代码代码如下:
•多个ajax请求相互依赖,必须有先后顺序。
•多个请求被同时发送,只需要最后一个请求。
第1种case
应用场景:这个场景很多,一个页面打开是多个区域同时请求后台得到各自的数据,没依赖,没顺序。
处理方案:直接用jquery的ajax函数。这个用的非常多,这里从略,可看后面的代码中例子。
第2种case
应用场景:多个ajax请求,需要顺序执行,后一个ajax请求的执行参数是前一个ajax的结果。例如:用户登录后我们发送一次请求得到用户的应用ID,然后利用应用ID发送一次请求得到具体的应用内容(例子虽然不是太恰当,但基本就是这个意思了)。
处理方法:
1.利用ajax参数async设置为false,进行同步操作。(这个方法只适合同域操作,跨域需使用下面两种方法)
2.利用ajax嵌套(这个同第1种情况)
3.利用队列进行操作
jqueryajax队列操作核心代码:
(function($){
varajaxRequest={};
$.ajaxQueue=function(settings){
varoptions=$.extend({className:"DEFEARTNAME"},$.ajaxSettings,settings);
var_complete=options.complete;
$.extend(options,{
complete:function(){
if(_complete)
_complete.apply(this,arguments);
if($(document).queue(options.className).length>0){
$(document).dequeue(options.className);
}else{
ajaxRequest[options.className]=false;
}
}
});
$(document).queue(options.className,function(){
$.ajax(options);
});
if($(document).queue(options.className).length==1&&!ajaxRequest[options.className]){
ajaxRequest[options.className]=true;
$(document).dequeue(options.className);
}
};
})(jQuery);
第3中case
应用场景:比较典型的是autocomplete控件的操作,这个我们可以使用第2种情况的处理方法,但我们可能只需要最后次按键后返回的结果,这样利用第2种处理方法未免有些浪费。
处理方法:保留最后一次请求,cancel之前的请求。
(function($){
varjqXhr={};
$.ajaxSingle=function(settings){
varoptions=$.extend({className:"DEFEARTNAME"},$.ajaxSettings,settings);
if(jqXhr[options.className]){
jqXhr[options.className].abort();
}
jqXhr[options.className]=$.ajax(options);
};
})(jQuery);
对于这些case都是在多个ajax请求,响应时间不能控制的情况。下面是完整Demo代码。
(function($){
varjqXhr={},
ajaxRequest={};
$.ajaxQueue=function(settings){
varoptions=$.extend({className:"DEFEARTNAME"},$.ajaxSettings,settings);
var_complete=options.complete;
$.extend(options,{
complete:function(){
if(_complete)
_complete.apply(this,arguments);
if($(document).queue(options.className).length>0){
$(document).dequeue(options.className);
}else{
ajaxRequest[options.className]=false;
}
}
});
$(document).queue(options.className,function(){
$.ajax(options);
});
if($(document).queue(options.className).length==1&&!ajaxRequest[options.className]){
ajaxRequest[options.className]=true;
$(document).dequeue(options.className);
}
};
$.ajaxSingle=function(settings){
varoptions=$.extend({className:"DEFEARTNAME"},$.ajaxSettings,settings);
if(jqXhr[options.className]){
jqXhr[options.className].abort();
}
jqXhr[options.className]=$.ajax(options);
};
})(jQuery);
varajaxSleep=(function(){
var_settings={
type:"GET",
cache:false,
success:function(msg){
varthtml=$("#txtContainer").html();
$("#txtContainer").html(thtml+"<br/>"+msg);
}
};
return{
get:function(seconds,mode,isAsync){
varmode=mode||"ajax",
isAsync=isAsync||false;
$[mode]($.extend(_settings,{
url:"ResponsePage.aspx?second="+seconds,
async:isAsync,
className:"GET"
}));
},
post:function(seconds,mode,isAsync){
varmode=mode||"ajax",
isAsync=isAsync||false;
$[mode]($.extend(_settings,{
type:"POST",
url:"PostPage.aspx",
data:{second:seconds},
async:isAsync,
className:"POST"
}));
}
};
}());
varlaunch=function(settings){
$("#txtContainer").html("");
varmode=settings.mode,
isAsync=settings.isAsync;
ajaxSleep.get(12,mode,isAsync);
ajaxSleep.get(10,mode,isAsync);
ajaxSleep.get(8,mode,isAsync);
ajaxSleep.post(6,mode,isAsync);
ajaxSleep.post(4,mode,isAsync);
ajaxSleep.post(2,mode,isAsync);
}
$(document).ready(function(){
//第1种case
$("#btnLaunchAsync").click(function(){
launch({isAsync:true});
});
//第2种case
$("#btnLaunchSync").click(function(){
launch({});
});
//第2种case
$("#btnLaunchQueue").click(function(){
launch({mode:"ajaxQueue",isAsync:true});
});
//第3种case
$("#btnLaunchSingle").click(function(){
launch({mode:"ajaxSingle",isAsync:true});
});
});
default.html
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headid="Head1"runat="server">
<title></title>
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"type="text/javascript"></script>
<scripttype="text/javascript"src="js/default.js"></script>
</head>
<body>
<formid="form1"runat="server">
<inputtype="button"id="btnLaunchAsync"value="LaunchAsynchronousRequest"/>
<inputtype="button"id="btnLaunchSync"value="LaunchSynchronousRequest"/>
<inputtype="button"id="btnLaunchQueue"value="LaunchRequestedQueue"/>
<inputtype="button"id="btnLaunchSingle"value="LaunchSingleRequest"/>
<divid="txtContainer"></div>
</form>
</body>
</html>
PostPage.aspx&ResponsePage.aspx
//ResponsePage.aspx
protectedvoidPage_Load(objectsender,EventArgse)
{
intseconds=int.Parse(Request.QueryString["second"]);
Thread.Sleep(seconds*1000);
Response.Write("GET:selptfor"+seconds.ToString()+"sec(s)");
}
//PostPage.aspx
protectedvoidPage_Load(objectsender,EventArgse)
{
intseconds=int.Parse(Request.Form["second"]);
Thread.Sleep(seconds*1000);
Response.Write("POST:selptfor"+seconds.ToString()+"sec(s)");
}
后注:个人能力有限,如有错误敬请指点。这些只是些根据一些特定情况下的处理,如果一个ajax请求能解决的问题切勿利用两个请求来处理,毕竟需要占用资源。我还是相信没有最好的方案,只有最适合的方案。
相关文章
- 使用阻塞队列实现线程同步_线程可以并行执行吗
- 【RTOS训练营】作业讲解、队列和环形缓冲区、队列——传输数据、队列——同步任务和晚课提问
- 共享内存同步机制_共享内存通信机制
- 同步异步阻塞非阻塞详解
- MariaDB 主从同步与热备
- 维护专题:Oracle GoldenGate同步服务归档空间维护介绍
- PostgreSQL中Slony-I同步复制部署教程
- redis-shake同步redis数据的实现方法
- MySQL数据库同步解决方案探索(mysql数据库同步方案)
- 一键式使用Linux百度盘同步文件(linux百度盘同步)
- Oracle缓存同步的实时优化(oracle缓存同步)
- 实现Oracle数据实时同步的简单方法(oracle数据实时同步)
- 如何实现MySQL两张表的同步?(mysql两张表同步)
- Linux自动同步时间:简单命令即可完成(linux自动同步时间命令)
- Linux下的时钟同步配置指南(linux时钟同步配置)
- MySQL主从同步的最佳实践:清除主从数据同步异常。(mysql清除主从)
- Oracle关联更新实现数据间的相互同步(oracle关联相互更新)
- 红色的同步Redis集群复制(redis集群同步复制)
- 突破海量数据同步Redis助力之路(redis海量数据同步)
- SQLServer作业同步(结合备份作业)