Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何每10秒发出一次Ajax请求(除了长轮询)?_Javascript_Jquery_Ajax_Json - Fatal编程技术网

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

Javascript 如何每10秒发出一次Ajax请求(除了长轮询)?,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我正在尝试使用以下方法每10秒从服务器获取一个json对象请求: setInterval(function(){ $.ajax({ url: '/', success: function(data){ //do stuff with data } }); }, 10000); 但这不是很有效。我知道投票时间很长,但我认为这不会有太大的区别。我知道我每10秒会收到一次新数据,所以长轮询在效率上是否与setInterval完全相同 浏览器端缓存是解决此问

我正在尝试使用以下方法每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]。用户,然后使用“淡出”和“淡出”等将其平滑地更改为数据[1]。用户,直到用户数用完为止。 我基本上想创建一个用户用户名的幻灯片

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


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

长轮询比setInterval(fn,delay)更好,因为至少这样,服务器会在数据准备好时向您发送更新的数据,而客户端会做出这样的假设,然后发出可能没有更改的数据请求


如果您可以控制客户机/服务器技术,则无需在每次推送时重新连接XHR,就可以将数据推送到客户机上。我肯定会考虑使用缓存。特别是如果你得到的集合有更多的用户,每10秒发出一个AJAX请求很容易让你的服务器过载。但是,如果您想保持简单,可以每隔几分钟请求一次更新。缓存用户,将其生成到javascript代码中,比如users=newarray(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