ajax异步提交后出现卡死现象

来源:互联网 发布:阿里云maven镜像站 编辑:程序博客网 时间:2024/04/30 08:56

本人是做电视节目站点开发,最近出现一个问题,异步提交后,页面一直在缓冲,出现卡死现象,

在电脑测试一切正常,感觉很郁闷,代码什么没有问题,后发现是ajax问题。

ajax分为同步提交和异步提交。以下是两个方法区别。


异步方法:

  1. function getJSON2(){  
  2.             var tmp;  
  3.             var xmlHttpRequest=createAjaxObject();  
  4.             xmlHttpRequest.open('GET',url,true);//GET即采用get方法,url为请求的地址,true设置为异步,默认就是异步,所以也可以不用写  
  5.             xmlHttpRequest.send(null);  
  6.             xmlHttpRequest.onreadystatechange = function(){  //注册回调函数  
  7.                 //readyState有四种可能值:0——请求未初始化(在调用 open() 之前),1——请求已提出(调用 send() 之前),2——请求已发送(这里通常可以从响应得到内容头部),3——请求处理中,4——请求已完成。  
  8.                 if(xmlHttpRequest.readyState==4){  
  9.                     if(xmlHttpRequest.status == 200){  
  10.                         alert(xmlHttpRequest.responseText);  
  11.                         //var json = eval('('+xmlHttpRequest.responseText+')');  
  12.                         //alert(json.Stops[0].StopName);  
  13.                        //tmp = json.Stops[0].StopName;  
  14.                        //alert(tmp);//有值  
  15.                      }  
  16.                 }  
  17.             }  
  18.             //alert(tmp); //没有值  
  19.             xmlHttpRequest=null;  
  20.         }  
  21. 同步方法:
  1. function getJSON2(){  
  2.             var tmp;  
  3.             var xmlHttpRequest=createAjaxObject();  
  4.             xmlHttpRequest.open('GET',url,false);//GET即采用get方法,url为请求的地址,false设置为同步,默认就是异步,所以也可以不用写  
  5.             xmlHttpRequest.send(null);  
  6.             var result = xmlHttpRequest2.status;  
  7.                     if(result == 200){  
  8.                         alert(xmlHttpRequest.responseText);  
  9.                         //var json = eval('('+xmlHttpRequest.responseText+')');  
  10.                         //alert(json.Stops[0].StopName);  
  11.                        //tmp = json.Stops[0].StopName;  
  12.                        //alert(tmp);//有值  
  13.             }  
  14.             //alert(tmp); //有值,成功,但是破坏了ajax异步的初衷。  
  15.             xmlHttpRequest=null;  
  16.         }  
总结:对于一些数据的获取,同步必须要等到服务器的响应。如果是异步(true),返回值是null,因为程序执行完send后不等xmlhttp的响应,而继续执行下一条js语句,所以tmp还没有来的及变化就已经返回null了。所以如果想获得xmlhttp返回值必须用同步,异步无法得到返回值。 这就是为什么我在后面的操作一直取不到这个函数的返回值的缘故了。ajax的同步破坏了ajax异步的初衷,除非忘不得已(比如需要对响应的数据进行进一步处理)才使用。
 还有,同步异步使用xmlhttp池时都要注意:取得xmlhttp时只能新建xmlhttp,不能从池中取出已用过的xmlhttp,(这种情况主要发生在需要循环的时候)因为被使用过的xmlhttp的readyState为4,所以同步异步都会send但不执行onreadystatechange。

0 0
原创粉丝点击