详解Ajax请求(四)——多个异步请求的执⾏顺序
⾸先提出⼀个问题:点击页⾯上⼀个按钮发送两个ajax请求,其中⼀个请求会不会等待另⼀个请求执⾏完毕之后再执⾏?
答案是:不会,这两个异步请求会同时发送,⾄于执⾏的快与慢,要看响应的数据量的⼤⼩及后台逻辑的复杂程度。
从异步请求的执⾏原理来看,我们知道当⼀个异步请求发送时,浏览器不会处于锁死、等待的状态,从⼀个异步请求发送到获取响应结果的期间,浏览器还可以进⾏其它的操作。这就意味着多个异步请求的执⾏时并⾏的。
下⾯我们还是从⼀个例⼦来看⼀下这个问题。
要求:ajax1从后台请求下拉列表的数据,ajax2从后台请求下拉列表要选中的某⼀项的数据。
<input type="button" value="测试按钮" onclick="sentAjax();"/><br>
<select id="selectClassify" ></select>
js代码:
<script type="text/javascript">
function sentAjax(){
Ajax1();
Ajax2();
}
function Ajax1(){
$.ajax({
cache : false,
url:"<%=basePath%>/manager/test/ajax1",
success: function(result){
alert("Ajax1");
$("#selectClassify").html("");
var html = "";
var selectJson = result.downList;
$.each(selectJson, function(i, item) {
html = html+"<option value='" + item + "'>" + item + "</option>";
});
$("#selectClassify").append(html);
}
});
}
function Ajax2(){
$.ajax({
cache : false,
url:"<%=basePath%>/manager/test/ajax2",
success: function(result){
alert("Ajax2");
$("#selectClassify").val(result.kind);
}
});
}
</script>
java代码:
@Controller
发送ajax请求的步骤@RequestMapping("/manager/test")
public class TestAjax {
@ResponseBody
@RequestMapping("/ajax1")
public Map<String ,String[]> ajax1(){
Map<String ,String[]> jsonMap = new HashMap<String, String[]>();
String[] downList = new String[2000]; //这⾥为了说明ajax2不会等待ajax1执⾏完之后再执⾏,让ajax1响应的数据量较⼤。
for(int i = 0;i < 2000;i++){
downList[i] = "<---"+ (i+1) + "--->";
}
jsonMap.put("downList", downList);
return jsonMap;
}
@ResponseBody
@RequestMapping("/ajax2")
public Map<String ,String> ajax2(){
Map<String ,String> jsonMap = new HashMap<String, String>();
jsonMap.put("kind", "<---7--->");
return jsonMap;
}
}
点击测试按钮我们发现alert("Ajax2")先于alert("Ajax1")弹出,说明Ajax2没有等待Ajax1,异步请求是并⾏的,执⾏的快与慢,要看响应
的数据量的⼤⼩及后台逻辑的复杂程度。⽽且有⼀个现象是:最后下拉框显⽰的是
ajax2请求的下拉列表要选中的某⼀项的数据没有展⽰出来,这说明ajax2对页⾯的操作快于ajax1,这时ajax1对页⾯的操作还没开始,所以导致ajax2对页⾯的操作没有效果。
要解决这个问题也不难,这⾥提供两种解决⽅案:
(1)Ajax2()⽅法的执⾏放到Ajax1()的success回调函数的最后⼀⾏。
(2)Ajax1()的异步请求⽅法中,增加⼀个回调函数:complete : Ajax2
(3)当然针对这个问题⽽⾔还有很多解决办法,⽐如下拉列表采⽤同步的⽅式来画,⽽数据的回显使⽤异步,或者⼀个异步请求把所有数据返回,然后按照逻辑顺序进⾏数据展⽰,这些就不再本⽂的讨论范围内了。
最后说⼀点,我们作为程序员,研究问题还是要仔细深⼊⼀点的。当你对原理了解的有够透彻,开发起来也就得⼼应⼿了,很多开发中的问题和疑惑也就迎刃⽽解了,⽽且在⾯对其他问题的时候也可做到
触类旁通。当然在开发中没有太多的时间让你去研究原理,开发中要以实现功能为前提,可等项⽬上线的后,你有⼤把的时间或者空余的时间,你⼤可去刨根问底,深⼊的去研究⼀项技术,为觉得这对⼀名程序员的成长是很重要的事情。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论