论坛首页 Web前端技术论坛

定时器AJAX请求重帧现象

浏览 10569 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-24   最后修改:2011-06-23
  最近做一个关于定时AJAX请求数据库信息问题,发现经常有重帧现象。
  目前的代码:
  
var id = 0;
window.onload = function() {
    id = document.getElementById("maxId").value;
	initXMLRequest();
    setInterval("sendHTTPRequest()", 1000);
};

var xmlRequest = null;
function initXMLRequest() {
	if (window.ActiveXObject) {
		xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		if (window.XMLHttpRequest) {
			xmlRequest = new XMLHttpRequest();
		}
	}
}
function sendHTTPRequest() {
	var url = "decodePass?id=" + id + "&sync=" + sync;
	if (xmlRequest) {
		xmlRequest.open("POST", url, true);
		xmlRequest.onreadystatechange = isDataExists;
        xmlRequest.setRequestHeader("If-Modified-Since","0");
		xmlRequest.send(null);
	}
}
function isDataExists() {
	if (xmlRequest.readyState == 4) {
		if (xmlRequest.status == 200) {
			id++;
		}
	}
}

  个人推断:
    1、在定时轮询AJAX时,在当前设置的循环时间内,没有请求到所要请求的值,这样会发生AJAX URL 没有改变,所以
   下次请求还是上次请求的内容,当好几次都没有请求到数据的时候,这样到最后堆积到一块,就会请求到许多重复数据
  想到的解决办法:
   1、采用递归方法,在方法里面写定时调用方法,可是这样的话当第一次没有请求到数据时候就不会在请求了,
  
window.onload = function() {
    sendHTTPRequest();
};
function isDataExists() {
	if (xmlRequest.readyState == 4) {
		if (xmlRequest.status == 200) {
			 setInterval("sendHTTPRequest()", 1000);
                          id++;
		}
	}
}


解决办法:
1、把异步请求改成同步请求
2、把setInterval 改成 setTimeout 改为请求完成停顿一秒再请求
3、锁定窗口请求(没试过)
引用
window.reqstate = false;

   发表时间:2011-05-24  
Who还有其他的解决方法,一块探讨下撒!
0 请登录后投票
   发表时间:2011-05-24  
奥义之舞 写道
Who还有其他的解决方法,一块探讨下撒!

可以使用长连接.
   这边有个文章你可以看看.
   http://www.ibm.com/developerworks/cn/web/wa-lo-comet/index.html
或者你可以在论坛搜索一下.
0 请登录后投票
   发表时间:2011-05-24  
这个长连接的方式了解过了,想先把这种AJAX方式的解决了,放到上面之后在自己解决
0 请登录后投票
   发表时间:2011-05-24  
winting 写道
奥义之舞 写道
Who还有其他的解决方法,一块探讨下撒!

可以使用长连接.
   这边有个文章你可以看看.
   http://www.ibm.com/developerworks/cn/web/wa-lo-comet/index.html
或者你可以在论坛搜索一下.

而且你说的额长连接,
1、AJAX长轮询这种,IE不支持,主要面向的浏览器就是ie的
2、使用Iframe这种,状态栏一直更新是一,HTTP长连接数要小于3吧、
并且对他的实现没有太好的思路
0 请登录后投票
   发表时间:2011-05-25  
http://www.zeitoun.net/articles/comet_and_php/start
利用 htmlFile 解决IE的状态栏一直更新.
0 请登录后投票
   发表时间:2011-05-25  
控制轮询获取的数据,把重复请求获取的数据剔除。不知道行不。
0 请登录后投票
   发表时间:2011-05-25  
setInterval  请求,意味着: 每隔一秒都会发起请求, 如果一个请求还没有完成, 可能有网络延时, setInterval 就会发生同时有多个请求挂着, 改为 setTimeout 请求

function poll_data(){
$.post(url, data, function(){  // 以jquery的 post函数为例
  setTimeout( function(){
     poll_data() ; // 在请求完成后,再等一秒, 调用自身  
  },  1000);
});
}
0 请登录后投票
   发表时间:2011-05-25  
你可以使用在传参数时加一个随机数
{'a':Math.random()}
我在项目中是这样解决的
也可传new Date()
0 请登录后投票
   发表时间:2011-05-25  
winting 写道
http://www.zeitoun.net/articles/comet_and_php/start
利用 htmlFile 解决IE的状态栏一直更新.

恩 好代码 虽然是PHP的 呵呵
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics