`
奥义之舞
  • 浏览: 284413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

定时器AJAX请求重帧现象

 
阅读更多
  最近做一个关于定时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;

分享到:
评论
29 楼 奥义之舞 2011-05-31  
silence1214 写道
奥义之舞 写道
silence1214 写道
你这个问题应该是同步异步的问题,ajax默认是异步的,没有等到你这次的返回下一次又开始请求了,可能一下子得到2个的结果。你尝试下设置为同步。就是这次等到结果了,才触发下一次的轮训就好了

我同时用了同步,setTimeout 恩 好了 基本上没有这个问题了!


要感谢我下撒

    
所有提过意见的 都感谢
28 楼 silence1214 2011-05-31  
奥义之舞 写道
silence1214 写道
你这个问题应该是同步异步的问题,ajax默认是异步的,没有等到你这次的返回下一次又开始请求了,可能一下子得到2个的结果。你尝试下设置为同步。就是这次等到结果了,才触发下一次的轮训就好了

我同时用了同步,setTimeout 恩 好了 基本上没有这个问题了!


要感谢我下撒
27 楼 奥义之舞 2011-05-30  
vb2005xu 写道
lz加个状态位 不就解决了么??

sendHTTPRequest(){
  if(window.reqstate) return;
 
  // 执行你的代码
 
  window.reqstate = true;

}

# function isDataExists() { 
#     if (xmlRequest.readyState == 4) { 
#         if (xmlRequest.status == 200) { window.reqstate = false;
   

我看了后面的回复 都在讲 怎么处理 服务端的数据 ... 我很不能理解

问题我感觉 就在一点  ajax 重复请求资源 就是 客户端向服务器的请求数 ++

这个和后端 有什么关系呢... 只要限定 客户端向服务器发送请求 不就可以了么???

加个状态位 完全可以抑止 HTTP请求啊

这个应给也可以,不过我没试,我用了同步 就差不多了 意思都是这样 ,让这一条请求结束之后再进行下一条、、
26 楼 奥义之舞 2011-05-30  
silence1214 写道
你这个问题应该是同步异步的问题,ajax默认是异步的,没有等到你这次的返回下一次又开始请求了,可能一下子得到2个的结果。你尝试下设置为同步。就是这次等到结果了,才触发下一次的轮训就好了

我同时用了同步,setTimeout 恩 好了 基本上没有这个问题了!
25 楼 vb2005xu 2011-05-30  
lz加个状态位 不就解决了么??

sendHTTPRequest(){
  if(window.reqstate) return;
 
  // 执行你的代码
 
  window.reqstate = true;

}

# function isDataExists() { 
#     if (xmlRequest.readyState == 4) { 
#         if (xmlRequest.status == 200) { window.reqstate = false;
   

我看了后面的回复 都在讲 怎么处理 服务端的数据 ... 我很不能理解

问题我感觉 就在一点  ajax 重复请求资源 就是 客户端向服务器的请求数 ++

这个和后端 有什么关系呢... 只要限定 客户端向服务器发送请求 不就可以了么???

加个状态位 完全可以抑止 HTTP请求啊
24 楼 silence1214 2011-05-29  
你这个问题应该是同步异步的问题,ajax默认是异步的,没有等到你这次的返回下一次又开始请求了,可能一下子得到2个的结果。你尝试下设置为同步。就是这次等到结果了,才触发下一次的轮训就好了
23 楼 evangelionxb 2011-05-26  
var t_ajax = setTimeout("sendHTTPRequest()",1000);
建议使用 setTimeout方法

url 加上一个 戳。

var d = new Date();
var url = "decodePass?id=" + id + "&sync=" + sync + "&time=" + d.getTime();

应该就可以了
22 楼 aiyanbo 2011-05-26  

xmlRequest.open("POST", url, true); 
改成
xmlRequest.open("POST",url+="&random="+Math.random(),true);
看看
21 楼 奥义之舞 2011-05-25  
hyj1254 写道
相当于连续发2次相同url的请求,这也不会有什么问题,顶多你的回调函数调2次而已,难道会出现第二次调用的第一次的数据?你想让两次请求按次序前一个执行完毕再执行下一个可以设置open("post",url,false);

哦 是的 同步执行也行 呵呵

两次相同数据没什么大问题 我说不行主要是因为我需要根据这数据来绘制图,如果我不做处理的画,相同数据画出来的图是不好看的,一眼都能看出来这数据是错的 ,所以需要修改
20 楼 hyj1254 2011-05-25  
相当于连续发2次相同url的请求,这也不会有什么问题,顶多你的回调函数调2次而已,难道会出现第二次调用的第一次的数据?你想让两次请求按次序前一个执行完毕再执行下一个可以设置open("post",url,false);
19 楼 奥义之舞 2011-05-25  
clue 写道
fixsmall 写道
setInterval  请求,意味着: 每隔一秒都会发起请求, 如果一个请求还没有完成, 可能有网络延时, setInterval 就会发生同时有多个请求挂着, 改为 setTimeout 请求

function poll_data(){
$.post(url, data, function(){  // 以jquery的 post函数为例
  setTimeout( function(){
     poll_data() ; // 在请求完成后,再等一秒, 调用自身  
  },  1000);
});
}

这个方案可以完美解决,这种定时ajax请求,一定要做成这种形式:上次请求结束后才开始计算间隔
否则就会出现前面说的问题,当网络状况不好时可能多个请求会被密集
特别是是当服务器性能不足时,这样子请求会加重负担,多个请求同时进行,同时等待完成。

是的 我也是怀疑是 网络延迟等各种状况造成的,  在一秒中他没有请求到所要请求的数据, 然后又进行下一个数据了,
这样的话ID就是一样的,没有增加,所以可能有几条数据都是相同的、、
18 楼 奥义之舞 2011-05-25  
nenyalanye_1 写道
你这个问题的本质好像就是缓存的问题 导致多次请求都一样 加个时间戳

呵呵 我修改一下 我在里面是对ID这个变量自增了的 所以说他每次请求的URL 是不一样的
17 楼 奥义之舞 2011-05-25  
cyh_it 写道
其实你看 我传的参数 ID 它本身就是自增的(是我没写明呵呵 ) 这样他每个都不一样的

但我看到你的代码是:

var id = 0;  
window.onload = function() {  
    id = document.getElementById("maxId").value;  
    .....
}

id的值只是每一次页面加载是得到后,后面就没有再改变啊。


是我的错 我的代码没贴完全 我只是解释这种AJAX重帧现象,忘了还有缓存的问题了, 这个我解释一下,不是缓存的问题 呵呵 我的ID 在下面是自增的了 不过是在回调函数里面的了
16 楼 skzr.org 2011-05-25  
奥义之舞 写道
cyh_it 写道
你可以使用在传参数时加一个随机数
{'a':Math.random()}
我在项目中是这样解决的
也可传new Date()

这个应该是解决页面缓存的问题的吧 呵呵
其实你看 我传的参数 ID 它本身就是自增的(是我没写明呵呵 ) 这样他每个都不一样的
而且我还设置了
xmlRequest1.setRequestHeader("If-Modified-Since","0");

这样页面本身就每次都请求的


从现象上看确实应该是“cyh_it”说的问题, 建议使用google浏览器chrome然后查看newwork具体情况,可以知道原因的。
建议:
1. 少量数据还是用http的get方式好些
2. 在每次url后加时间如:url += '&__time=' + (new Date()).getTime(),不需要设置任何其他东西了
3. 使用工具监控具体http请求,可以使用firebug或者chrome network监控或者wireshark等软件
15 楼 nenyalanye_1 2011-05-25  
你这个问题的本质好像就是缓存的问题 导致多次请求都一样 加个时间戳
14 楼 clue 2011-05-25  
fixsmall 写道
setInterval  请求,意味着: 每隔一秒都会发起请求, 如果一个请求还没有完成, 可能有网络延时, setInterval 就会发生同时有多个请求挂着, 改为 setTimeout 请求

function poll_data(){
$.post(url, data, function(){  // 以jquery的 post函数为例
  setTimeout( function(){
     poll_data() ; // 在请求完成后,再等一秒, 调用自身  
  },  1000);
});
}

这个方案可以完美解决,这种定时ajax请求,一定要做成这种形式:上次请求结束后才开始计算间隔
否则就会出现前面说的问题,当网络状况不好时可能多个请求会被密集
特别是是当服务器性能不足时,这样子请求会加重负担,多个请求同时进行,同时等待完成。
13 楼 cyh_it 2011-05-25  
其实你看 我传的参数 ID 它本身就是自增的(是我没写明呵呵 ) 这样他每个都不一样的

但我看到你的代码是:

var id = 0;  
window.onload = function() {  
    id = document.getElementById("maxId").value;  
    .....
}

id的值只是每一次页面加载是得到后,后面就没有再改变啊。
12 楼 奥义之舞 2011-05-25  
qingpu 写道
控制轮询获取的数据,把重复请求获取的数据剔除。不知道行不。

我也想到这个方法了,不过这个方法感觉有点弊病
1、我需要在页面中存储过去的数据
    2、这样还是避免不了相同ID请求的存在
    3、连接数还是增多了,虽然很少 ==同于2

呵呵
11 楼 奥义之舞 2011-05-25  
fixsmall 写道
setInterval  请求,意味着: 每隔一秒都会发起请求, 如果一个请求还没有完成, 可能有网络延时, setInterval 就会发生同时有多个请求挂着, 改为 setTimeout 请求

function poll_data(){
$.post(url, data, function(){  // 以jquery的 post函数为例
  setTimeout( function(){
     poll_data() ; // 在请求完成后,再等一秒, 调用自身  
  },  1000);
});
}

这个方法应该可行 等我长时间测试以下
不过setTimeout 是在到这一行是停留一秒在继续执行setTimeout方法吧?
:wink:
Thank you!
10 楼 奥义之舞 2011-05-25  
cyh_it 写道
你可以使用在传参数时加一个随机数
{'a':Math.random()}
我在项目中是这样解决的
也可传new Date()

这个应该是解决页面缓存的问题的吧 呵呵
其实你看 我传的参数 ID 它本身就是自增的(是我没写明呵呵 ) 这样他每个都不一样的
而且我还设置了
xmlRequest1.setRequestHeader("If-Modified-Since","0");

这样页面本身就每次都请求的

相关推荐

    js定时器+ajax,间隔10s调用一次

    主要用于消息提醒,利用js页面定时器,定时提交ajax请求,查询最新的消息记录。改了很多次,终于成功了。

    解决js ajax同步请求造成浏览器假死的问题

    本文将探讨由同步AJAX请求造成的浏览器假死现象,并给出解决方案。 首先,我们需要了解什么是同步请求和异步请求。在AJAX中,通过设置async选项,我们可以控制请求是同步还是异步。同步请求会在请求完成之前阻塞...

    ajax请求提示

    "ajax请求提示"是用户体验设计的一个重要方面,旨在向用户展示后台正在处理的数据加载过程,提供一个友好的反馈机制,增强交互体验。 在描述中提到的“页面发起ajax请求提示时会有一个延时的提示效果”,这通常涉及...

    单片机中断定时器定时器定时器

    中断系统允许单片机在执行某个任务时,响应其他事件请求,如定时器溢出,并暂时停止当前任务,转去处理事件请求,处理完后再回到原来的任务。 第一节中断概述: 中断是指单片机在执行某个任务时,遇到其他事件请求...

    ajax_timer.

    而“ajax_timer”似乎是指在AJAX应用中使用的定时器功能,这通常涉及到动态加载或定时触发的请求。下面我们将详细探讨AJAX定时器的工作原理、实现方式以及其在实际项目中的应用。 ### 1. AJAX定时器基础 **1.1 ...

    jQuery取消ajax请求的方法

    然而,有时我们需要在发送Ajax请求后取消它,比如用户在请求处理完成前执行了其他操作。本文将深入探讨如何在jQuery中使用xhr对象的`.abort()`方法来取消Ajax请求。 首先,jQuery的$.ajax()函数是创建Ajax请求的...

    关于多个Ajax请求执行返回先后的问题示例探讨

    通过给定时器一个合适的等待时间,尝试确保前一个Ajax请求能够在下一个请求前完成。但是,这种方法并不稳定,因为它依赖于估计Ajax请求执行的时间,这在实际中往往难以准确预估。除了使用定时器,文档还隐晦地提到了...

    Ajax刷新 java Ajax 页面刷新

    这种动态更新可以结合定时器(setInterval)定期发送Ajax请求,或者利用WebSocket实现即时通信。 总结,Ajax刷新在Java中是一个重要的技术,它提高了Web应用的交互性和响应性。通过理解Ajax的工作原理,熟练掌握...

    无刷新的定时器

    2. **Ajax请求**:回调函数中,使用`XMLHttpRequest`对象或者更现代的`fetch` API向服务器发送GET或POST请求,获取或者提交数据。请求的URL通常包含一个标识符,让服务器知道这是定时器触发的请求。 3. **处理响应*...

    STM32 定时器级联

    主定时器的UEV会触发从定时器的计数器重装载,这样两个计数器的值就可以相加,形成长计数器。 PWM输出在定时器级联中也有应用。例如,可以通过设置主定时器的PWM输出,然后让从定时器作为计数器,根据主定时器的...

    STC15W系列单片机的定时器0和定时器2以16位自动重装模式分别在两个端口输出脉冲

    在本项目中,我们将探讨如何利用这两个定时器在16位自动重装模式下,分别在两个不同的端口输出脉冲,并通过LCD12864液晶显示器来显示定时器的状态。 首先,我们来看定时器0。在16位自动重装模式下,定时器0可以工作...

    定时器重入问题解决

    Timer方法重入是指使用多线程计时器,一个Timer处理还...本代码中包含重入问题的产生及重入问题的四种解决方案(1、使用lock(Object) 2、设置一个标志 3、使用Interlocked.Exchange()方法 4、定时器的AutoReset属性)

    辅助软件 定时器计算器 辅助软件 定时器计算器

    辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 定时器计算器辅助软件 ...

    JS实现定时任务每隔N秒请求后台setInterval定时和ajax请求问题

    $.ajax({ success: function (returnValue) { window.setInterval(fnSetMarkPoint(), 5000); } }); 调用DiGui()方法后 问题: 每隔0.1秒创建一个setInterval,成一个树形的方式循环创建setInterval,直到页面崩溃 ...

    实验8 定时器中断实验_定时器_

    定时器是一种硬件电路,能够按照预定的时间间隔产生中断请求。在微控制器中,定时器通常用于计数、延时或者周期性任务的执行。在本实验中,我们将利用定时器来控制LED灯的亮灭,这需要对定时器的工作模式和中断机制...

    ZigBee——cc2530+定时器实验(用到不同的定时器)

    实验现象: 1、使用定时器1的模模式驱动LED闪烁,1s间隔 2、引出线,使用示波器:电调PWM信号输出:占空比为5% 3、呼吸灯:两个灯交替呼吸 4、外接蜂鸣器,引脚P07,蜂鸣器播放我和我的祖国、两只老虎、生日快乐等等...

    定时器0和定时器1 ARM PROTEUS

    在ARM处理器中,通常有多个定时器,例如定时器0和定时器1,它们都是基于计数器的,工作原理是计数器对内部时钟脉冲进行计数,达到预设值时产生中断请求。 定时器0和定时器1的配置主要涉及以下几个方面: 1. 工作...

    16bit自动重装定时器@mb90543

    富士通的MB90543是一款8位微控制器,具有丰富的功能和高性能,其中包括16位自动重装定时器。这个定时器能够自动重置其计数值,从而实现连续、无中断的计时操作。 自动重装定时器,也称为自动装载定时器,其工作原理...

    uni-app定时器实例

    【uni-app定时器实例】 uni-app是一个基于Vue.js开发的多端统一框架,它允许开发者编写一次代码,就可以在iOS、Android、Web(H5)、微信小程序、支付宝小程序、百度小程序等多个平台上运行。在uni-app中,我们可以...

Global site tag (gtag.js) - Google Analytics