2010-11-06 121 views
3

我试图让从服务器请求一个JSON对象,每次10秒内使用这个:如何每10秒发出一次Ajax请求(除了长轮询)?

setInterval(function(){ 
    $.ajax({ 
    url: '/', 
    success: function(data){ 
     //do stuff with data 
    } 
    }); 
}, 10000); 

但是,这是不是很有效。我知道长时间投票,但我认为这不会产生很大的影响。我知道我会每10秒接收一次新数据,那么在效率方面不会长时间轮询与setInterval完全相同吗?

浏览器端缓存是否是解决此问题的良好解决方案?

的JSON对象我会得到这个样子的:

var data = {1: {'user': 'John', 'age': '25'}, {2: {'user': 'Doe', 'age': '30'}} 

有了这个,我要显示的数据[0]几秒钟。用户,之后顺利,改变成数据[1 ] .user通过使用'fadeOut'和'fadeIn'等等,直到它用完用户。 我基本上想创建用户用户名的幻灯片。

缓存是一个很好的解决方案还是应该坚持每10秒做一次ajax调用?如果是这样,那么我将如何实现这一点,如果不是,我应该使用什么方法?

我不知道如果我解释得不够好,所以告诉我,如果有什么东西还不清楚。

回答

6

我肯定会考虑缓存重新连接每个推XHR。特别是如果你的用户数量更多,每10秒发出一次AJAX请求可能会轻易超出你的服务器。但是,如果您想保持简单,请每隔几分钟发出一次请求,以便更新。缓存用户,让他们生成JavaScript代码,说users = new Array(user1,user2,...)。如果没有那么重要,你并不需要更新页面,因为大多数用户都会在一两分钟内离开。如果你有一个长的列表,每隔几秒就会改变一次,这给你足够的时间不必使用AJAX进行更新,只依赖服务器生成的用户列表。

如果不是,最后一次将列表更新到变量中,并在通过AJAX进行更新时将时间作为参数发送到服务器,然后让服务器快速检查添加了哪些新用户,并发送这些。然后,将新的服务器阵列与旧阵列合并。我强烈建议不要每10秒钟给一个新名字打一个电话。您不仅会在服务器上运行更多带宽,而且还会在列表中为您找到下一位用户时增加CPU使用率,然后发送给您。对于良好的实践,始终让客户尽可能多地完成工作,而不会有滞后。只有一台服务器,但有更多的客户。您转移到客户端的每项操作都会为您的服务器节省数百次(如果不是数千次)操作。

至于长轮询vs setInterval,我会建议在这种情况下setInterval。您至少可以发送带有时间参数的请求,指定最后一次更新时间,因此只需发送该小部分,而不是整个数据阵列。

var storage = new Array(user1, user2, ...); //set all your data here, generate it from your server 
var lastUpdate = //set the last time you updated it, just create a date variable 

function rotateUsers() 
{ 
    //do your fade in and fade out here 
} 

function update() 
{ 
    //create a new HttpRequest, and then set the url as "yoursite.com/update?lastUpdateTime="+lastUpdate; 
    //Take the response data, and merge the new users list with the old one 
} 
setInterval('rotateUsers()',10000); 
setInterval('update()',60000); //update once a minute 
0

长时间轮询会比setInterval(fn,delay)更好,因为至少在服务器准备就绪时,服务器只会向您发送更新的数据,而不是客户端做出此假设,然后发出数据请求已改变。

如果你有过客户机/服务器技术的控制,可以将数据推送到客户端,而不需要使用WebSockets