Rails 可以让 Ajax 保持开放多久

Posted

技术标签:

【中文标题】Rails 可以让 Ajax 保持开放多久【英文标题】:How long can rails keep Ajax open 【发布时间】:2013-06-26 15:10:15 【问题描述】:

我的应用程序假设在没有任何用户交互的情况下不断更新页面。标准是页面必须在那里,作为监视器上的一个额外窗口,以便用户可以看到实时更新的信息。

我在带有 Rails 的 jQuery 中使用 Ajax,我的问题是 - .erb 页面将 Ajax 保持打开状态多久?是否会有我必须刷新页面或重新初始化的地方?或者这根本就不是问题?

【问题讨论】:

您使用的是什么版本的导轨?在 rails 4 中,有一个直播功能,听起来可以满足您的要求。 check out this blog post about streaming data 我使用的是 3.2。但我的担忧有什么需要注意的吗? 所以听起来您拥有或需要一个呈现某些进程当前状态的页面。渲染页面肯定有超时。这些可能因应用程序服务器(例如独角兽)配置而异。如果您的后台页面总是返回当前状态,那么您的 ajax 调用可以循环运行以每隔一段时间轮询页面并刷新您的应用页面,从而无需打开连接。 理论上设置一个间隔是没有问题的(就像实时聊天一样),您应该考虑 @plasticide 指出的 Rails 4 流功能或使用套接字(例如 Socket.io 和 Node.js) 我拉数据的地方是一个专门的端口,它可以实时传输数据。我要做的是不断解码 JSON 发送的对象,如果这有帮助的话。 【参考方案1】:

Ajax 表示异步 javascript 和 XML。它所做的是将请求发送到服务器并以异步方式处理它的答案;无需刷新页面。

对 HTTP 服务器的请求不会保持打开状态(除非您将其配置为保持连接打开,通常情况并非如此)。 HTTP 协议是无状态的,这意味着您向服务器发出的每个请求都将被视为与之前的请求完全没有连接。事实上,要维护请求之间的状态,您必须在 Web 应用程序级别(在本例中为 rails)管理该状态,将浏览器会话的标识符发送到服务器(通常是本地存储在客户端 Web 浏览器 cookie 上的会话 ID)您的 Rails 应用程序可以处理它以识别打开的会话。

因此,除非您的前端正在与具有持久连接的 HTTP 服务器进行交互,否则您的服务器不会保持与 Web 浏览器打开的连接。它将发送它的响应并关闭连接。

AJAX 允许向服务器发出请求,并在不重新加载页面的情况下处理它的响应。 http 服务器将打开连接,直到它响应您的 Web 浏览器请求,然后关闭连接,因此不会保持连续性。

要保持 erb 视图上的数据更新,您必须使用 jQuery 进行管理,每 x 时间发送一次请求。 Bellow 是一个每 1 秒发出一次 ajax 请求的示例。

setInterval( "fetchDataAndUpdateView();", 1000 ); 
fetchDataAndUpdateView = function() 
  jQuery.ajax(
    url: "your-url",
    success: function() 
      //do something here to update your html with the data you got from the server
    
  )
);

【讨论】:

但这有一个间隔。我需要实时。 @Alexey 在这种情况下,您应该考虑使用 Rails 4 或 Socket(用于 Rails 的 Socket.io 和 Node.js)。此外,guille.mas 提出了一种解决方案,可以每秒检查一次,这还不错,几乎是实时的。 你说的是流吗?您的服务器的名称和版本是什么?我还以为你在哪里与像 Apache 或 nginx 这样的 http 服务器进行通信。 如果你必须实现服务器端,你应该考虑(正如@MrYoshiji 所说)一个套接字。 Socket.io 似乎是一个有趣的选择 :) 我得到了我们服务器的 IP 和端口,说它以 JSON 格式提供信息的持续更新。我必须能够获取该信息并在更新时显示在我的视图中。

以上是关于Rails 可以让 Ajax 保持开放多久的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rails 让我的 Twitter Bot 保持清醒?

我应该多久访问一次 Heroku 服务器以使其保持清醒? [复制]

Rails/Ajax 在提交后将表单从创建更改为更新

如何保持alexa技能开放?

Ruby on Rails 复数模型名称

Rails Cucumber使用Capybara测试AJAX