Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.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 在多个浏览器窗口中使用sam AJAX的最佳实践?_Javascript_Html_Ajax_Partial Page Refresh - Fatal编程技术网

Javascript 在多个浏览器窗口中使用sam AJAX的最佳实践?

Javascript 在多个浏览器窗口中使用sam AJAX的最佳实践?,javascript,html,ajax,partial-page-refresh,Javascript,Html,Ajax,Partial Page Refresh,我正在开发一个网站,有一些实时更新排序。 现在,网站是使用数据集当前ID的javascript变量生成的。 然后在几秒钟的时间间隔内进行AJAX调用,传递当前ID,如果有新的内容,服务器将返回它以及最新的ID,然后在javascript中更新该ID。 很简单,但问题来了 如果用户多次打开同一页面,则每个页面都会执行此AJAX请求,这会产生沉重的服务器负载 现在我想到了以下方法: 网站加载了当前时间戳和当前数据集ID的javascript变量。 我想要的刷新间隔是例如3秒 在网站中,间隔计数器每秒

我正在开发一个网站,有一些实时更新排序。 现在,网站是使用数据集当前ID的javascript变量生成的。 然后在几秒钟的时间间隔内进行AJAX调用,传递当前ID,如果有新的内容,服务器将返回它以及最新的ID,然后在javascript中更新该ID。 很简单,但问题来了

如果用户多次打开同一页面,则每个页面都会执行此AJAX请求,这会产生沉重的服务器负载

现在我想到了以下方法:

网站加载了当前时间戳和当前数据集ID的javascript变量。 我想要的刷新间隔是例如3秒

在网站中,间隔计数器每秒钟计数一次,每当时间戳达到
(timestmap%3==0)
返回true的状态时,内容就会更新。 链接看起来像

现在,这应该确保每个浏览器窗口调用相同的URL。 然后我可以打开浏览器级缓存

但我真的不喜欢这个解决方案。 我更喜欢在Cookie中添加另一层数据共享。 这应该不是什么大问题,我可以将每个请求存储在一个以时间戳和数据修订命名的cookie中,TTL为10秒左右,然后首先检查它是否存在

但是

页面将同时执行请求。因此,浏览器缓存和cookie的整个逻辑可能不起作用,因为请求是同时发生的,而不是一个接一个地发生的

所以我考虑将当前的连接限制在1个服务器端。但是我至少需要一个额外的vhost,因为我真的不想在整个页面上这样做。 这让我遇到了有关跨站点策略的问题

当然,有一些超级复杂的负载平衡解决方案/服务器端解决方案绑定到请求uri和ip地址之类的东西,但这一切都是极端的过度使用

这一定是一个常见的问题!想想facebook聊天吧。我真的不认为他们在你打开的每一个窗口里都会做所有的请求

有什么想法吗?我真的受不了这个

也许我可以做一些跨窗口Javascript通信?如果它都在同一个域上,应该不会有问题吗


当然,我可以做的一件事是服务器端缓存。这至少避免了DB连接和密集的计算。。。但这仍然是一个我希望避免的请求。

您可能希望签出并删除它。
这最好通过服务器推送技术来解决。

您可能需要签出并删除。
这最好通过服务器推送技术来解决。

第一件事是:无论如何都要进行服务器端缓存,使用或其他任何方式。因此,您可以抵御三台执行请求的机器。但你知道的

坦率地说,我认为您使用cookie的方法是正确的(但请参阅下面更现代的选项)-它们由所有窗口实例共享,易于查询,等等。您的轮询逻辑可能类似于以下内容:

在轮询间隔上:

  • 看看内容cookie:它比你拥有的更新鲜吗?如果是这样,使用它,你就完成了
  • 看看状态cookie;其他人是否正在进行轮询(例如,cookie已设置且未过时)?如果是,请稍后再来
  • 设置状态cookie:我正在(现在)进行主动轮询
  • 请求
答复如下:

  • 如果新数据比内容cookie的(可能已更新)内容更新,请将内容cookie设置为新数据
  • 如果设置状态cookie的人是您,则清除状态cookie
基本上,状态cookie充当一个信号量,向所有窗口实例指示某人正在某处更新内容

您的内容cookie可能直接包含内容,或者如果您的内容太大并且担心会受到限制,您可以让每个页面都有一个隐藏的iframe,每个页面都有一个唯一的名称,并且让Ajax更新将输出写入iframe。内容cookie将发布最新iframe的名称,而其他看到有新内容的窗口可以使用
窗口。打开
以获取该iframe(因为
窗口。如果使用现有窗口的名称,则打开
不会打开窗口)

对比赛情况保持警惕。尽管任何给定页面中的JavaScript都是单线程的(除非显式使用),但您不能期望其他窗口中的JavaScript一定是在同一线程上运行的(它在某些浏览器上运行,而在其他浏览器上运行——见鬼,在Chrome上甚至不是同一个进程)。我也不知道在编写cookies时有任何原子性的保证,所以你应该保持警惕

现在,HTML5定义了一些有用的东西,因此,你可能会考虑看看它们是否存在并在返回到Cookie方法之前使用它们,因为它们将在今天的现代浏览器中运行,而不是在你现在可能要处理的旧浏览器中。不过,在支持它的浏览器上,太棒了


作为上述内容的一个方面,这可能也是一个值得研究的选项,但您的客户端几乎肯定必须授予您的应用程序权限,这也是一件相当新鲜的事情。

第一件事是:无论如何都要使用或执行服务器端缓存。因此,您可以抵御三台执行请求的机器。但你知道的

坦率地说,我认为您使用cookie的方法是正确的(但请参阅下面更现代的选项)-它们由所有窗口实例共享,易于查询,等等。您的轮询逻辑可能类似于以下内容:

在轮询间隔上:

  • 看看内容cookie:它比你拥有的更新鲜吗?如果是这样,使用它,你就完成了
  • 看看状态cookie;其他人是否正在进行轮询(例如,cookie已设置且未过时)?如果是,请稍后再来
  • 设置