加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

杀死ajax请求

发布时间:2020-12-16 00:55:59 所属栏目:百科 来源:网络整理
导读:做web开发,使用jquery,有一个功能要求根据用户选择使用ajax请求不同内容放入同一个div内,实现起来比较简单:根据用户的选择设置不同url就行了。但是遇到了问题:用户连续请求了两次不同内容,有可能当第二次请求响应完毕后第一次请求才响应,这样虽然用户

做web开发,使用jquery,有一个功能要求根据用户选择使用ajax请求不同内容放入同一个div内,实现起来比较简单:根据用户的选择设置不同url就行了。但是遇到了问题:用户连续请求了两次不同内容,有可能当第二次请求响应完毕后第一次请求才响应,这样虽然用户进行了第二次请求,收到的数据却被第一次请求收到的数据覆盖了(有点像多线程同步问题)。要求最后显示用户最后一次请求的结果,怎么办呢?

方法一:设置asycn属性为false,进行同步请求。用户发了一次请求,等待浏览器获取结果,期间浏览器进入“假死”状态,直到得到结果或者timeout。如果这样,使用ajax就没有意义了。对于有些手速快的用户,在浏览器锁定之前发出了n多请求,“假死”就变成“真死”了。

方法二:一次请求发出后,屏蔽掉发出ajax请求的功能,直到第一次请求响应完毕。实现起来有些麻烦,不过浏览器不会锁住了。

方法三:在发出下一次ajax请求之前,取消之前未完成的ajax请求。

感觉方法三比较接近需求了,怎样实现呢?jquery有没有提供像杀死一个线程一样杀死ajax请求的方法呢?查看jquery API参考文档后没有结果,后来在http://bigc.at/jquery-ajax-abort.orz看到 $.ajax() 返回一个 xmlHttpRequest 对象,调用该对象的 abort() 方法可以结束ajax请求。

接下来有思路了,把之前发出的ajax请求返回的xmlHttpRequest对象放到数组中,每次发出ajax请求时,在beforesend的回调函数中取出数组中所有对象并abort()掉,这样保证了最后一次请求过程中只有自己一个请求。

var xhr=new Array();
var i=0;
var j=0;
xhr[i]=$.ajax({ 
beforeSend: function(){
		 if(i>0){
			 for(j;j<i;j++){
				 xhr[j].abort();
				 }
			 }
		i++;
		 }
});

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读