在进行Web开发时候使用Ajax技术进行前后台的交互是非常的常用的技术手段,而当你面临着以下的业务需求的时候你就需要进行Ajax的嵌套请求
业务需求
现在需要向服务器发送请求,我需要根据服务器那边的响应来决定是否发出另外一个请求,这叫做请求的嵌套
看以下的代码这是一个典型的请求范例
以下ajax实例代码
<script>
window.onload=function()
{
var TBtn = document.getElementById("btn1");
TBtn.onclick = function()
{
//如果有XMLHttpRequest,那就是非IE6浏览器。()里面加window的原因下面会有描述。
if(window.XMLHttpRequest)
{
var TAjax = new XMLHttpRequest();//创建ajax对象
}
else//如果没有XMLHttpRequest,那就是IE6浏览器
{
var TAjax = new ActiveXObject("Microsoft.XMLHTTP");//IE6浏览器创建ajax对象
}
TAjax.open("GET","a.txt?t='+new Date().getTime()",true);//加上t='+new Date().getTime()"的目的是为了消除缓存,每次的t的值不一样。
//发送请求
TAjax.send();
//接收返回
//客户端和服务器端有交互的时候会调用onreadystatechange
TAjax.onreadystatechange=function()
{
if(TAjax.readyState==4)
{
if(TAjax.status==200)//判断是否成功,如果是200,就代表成功
{
alert("成功"+TAjax.responseText);
}
else
{
alert("失败");
}
}
};
}
};
</script>
我们可以看见在发送请求的时候我们使用这句话来决定发送什么样的请求
TAjax.open(“GET”,”a.txt?t=’+new Date().getTime()”,true);
//异步传输
//异步:多件事一件一件的做
//同步:多件事情一起进行
//但是js里面的同步和异步和现实的同步异步相反。
//同步:多件事一件一件的做
//异步:多件事情一起进行
//ajax天生是用来做异步的
问题
使用原生ajax进行嵌套请求服务器回送值为空,我们需要明白下嵌套使用的时候服务器干了啥事情,首先先发送请求的ajax对象会获得一把锁名为异步锁,那么一直到函数执行完毕这把锁也不会释放,所以第二层请求压根不会被执行。
解决方案
所以当我们在写第二层请求的时候就要注意发送同步请求,也就是将ajax请求的参数设为false;这样他会避开异步锁,去要同步锁
比如说按照先后顺序
1. TAjax.open(“GET”,”a.txt?t=’+new Date().getTime()”,true);
2. TAjax2.open(“GET”,”b.txt?t=’+new Date().getTime()”,false);