做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++; } });原文链接:https://www.f2er.com/ajax/165951.html