如何每10秒发出一次Ajax请求(除了长轮询)?

时间:2010-11-06 17:36:39

标签: javascript jquery ajax json

我正在尝试使用这个来每10秒从服务器获取一个json对象:

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] .user几秒钟,然后通过使用'fadeOut'和'fadeIn'等顺利地将其更改为数据[1] .user,直到它用完为止用户。 我基本上想要创建用户用户名的幻灯片。

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

我不确定我是否解释得足够好,所以告诉我是否还有不清楚的地方。

2 个答案:

答案 0 :(得分:6)

我肯定会考虑缓存。特别是如果你获得了更多用户的集合,那么每10秒发出一次AJAX请求可能会使服务器过载。但是,如果您想保持简单,请每隔几分钟发出一次请求,以进行更新。缓存用户,将它们生成为javascript代码,比如users = new Array(user1,user2,...)。如果没有那么重要,你就不必继续更新页面,因为大多数用户无论如何都会在一两分钟内离开。如果你有一个每隔几秒就会改变的长列表,那么你就有足够的时间不必使用AJAX进行更新,只需要依赖服务器生成的用户列表。

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

至于长轮询与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

答案 1 :(得分:0)

长轮询将比setInterval(fn,delay)更好,因为至少服务器只会在准备就绪时向您发送更新的数据,而不是客户端进行该假设,然后触发对可能没有的数据的请求改变。

如果您可以控制客户端/服务器技术,则可以使用WebSockets

将数据推送到客户端,而无需在每次推送时重新连接XHR