【问题标题】:Rails ajax request periodically till specific answerRails ajax 定期请求直到具体答案
【发布时间】:2016-01-03 23:26:06
【问题描述】:

我正在使用 ajax 使用下面的代码刷新页面上的表格

是的,:class=> 'btn btn-成功 btn-xs' %>

在服务器上,页面重新加载启动了一个生成大表的过程。 目前我从服务器发送一个简单的“仍在处理”,如果大表没有准备好,如果大表准备好了,那么大量的 html。

第一季度。如何开始定期ajax刷新? Q2。如何解释服务器结果以停止定期 ajax 刷新?

【问题讨论】:

标签: jquery ruby-on-rails ruby ajax heroku


【解决方案1】:

您的问题很棘手,原因如下:

AJAX 请求是单个用户请求。除非您使用多线程,否则发送多个请求不会让您访问相同的响应,这相当于每次 ping 服务器时打开新请求。

与大多数人的想法不同,Ajax 并不是一个神奇的灯笼。这只是您的浏览器向/从您的服务器发送和处理XML 请求(JSON)的一种方式。事实上,Ajax 本身代表 A同步 Javascript And XML:

这样……


如何开始周期性的ajax刷新?

你没有。

您有两种选择:

  1. Ajax 长轮询
  2. Ajax 回调

Long Pollingmb_s88 描述的一样:

(function poll(){
   setTimeout(function(){
      $.ajax({ url: "server", success: function(data){
        //Update your dashboard gauge
        salesGauge.setValue(data.value);

        //Setup the next poll recursively
        poll();
      }, dataType: "json"});
  }, 30000);
})();

您每隔 X 秒向服务器发送一个 Ajax 请求,并根据需要将响应附加到您的 DOM。这通常用于极低负载的实例(因为您不断向服务器发送请求),例如聊天应用程序、cmets 等。

简而言之,长轮询是web sockets 的小弟弟。它是一种使用 JS 实现近乎实时功能的快速方法。您可以使用它来提供非常底层的信息,例如聊天响应、通知等。

Ajax 的主要限制是它会用请求轰炸您的服务器。这很糟糕,尤其是在处理大量数据时。

--

下一个选项是使用ajax callbacks

这实际上是您将 Ajax 响应包装在一个函数中的地方,允许您处理 异步 请求同步。听起来很复杂?并非如此,一旦您了解了 Ajax 的工作原理。

Ajax 旨在为您提供一种向服务器发送异步请求的方法。这意味着您的请求将绕过标准浏览器流程。

这是一个标准的“同步”请求,就像所有网络浏览器的工作方式一样。

该设计旨在让您收到对您发送的每个请求响应。例如,如果您单击一个链接,您实际上是在指示浏览器向服务器发送一个请求,它会将响应传递给服务器(以新网页的形式)。

AJAX 使您能够绕过这一点,增加了发送超出范围的请求的能力。这样做的好处包括 - 动态页面更新、通知、在页面上应用的新信息over-and-above the original request...

大多数 Ajax 功能的问题是必须等待。由于是异步的,您无法将其添加到流程中...简而言之,如果您有依赖功能,则无法“等待”

解决这个问题的方法是使用 回调...

$(document).ready(function(){
   doAjax("url", {data: here}, function(){
       // Ajax "success" callback
   }, function(){
       // Ajax "error" callback
   });
});

doAjax(url, data, success, error){
    $.ajax({
       url: url,
       data: data,
       success: success(data),
       error: error(data)
    });
});

这使您能够发送 ajax 请求并“等待”响应。这与设置“同步:真”相反,它会冻结浏览器。


如何解释服务器结果以停止周期性 ajax 刷新?

您使用 Ajax 回调并等待响应。

如果太大,请将其拆分为页面(根据@myst's 的答案)。

如果您仍然认为可以 ping 您的服务器并针对同一请求获得多个响应,请再次阅读我所写的内容。一个请求 = 一个响应。

【讨论】:

    【解决方案2】:

    虽然@mb_s88 的回答是对您问题的直接回答(我什至赞成),但我建议您重新考虑工作流程。

    我建议 AJAX 响应始终返回最多 X 个数量或数据(即最多 100 行)。

    更好的工作流程会让人感觉响应更快,用户可以体验到“正在发生的事情”(而不仅仅是等待),并且您可以通过使用较小的数据库查询来避免服务器端的大型阻塞任务。

    例如:

    我建议第一个 AJAX 请求将请求结果的第一个“页面”,如果页面已满,则设置“继续”标志(即,返回 100 行将启动“继续”工作流程)。

    我建议在加载下一个“页面”时显示现有数据,每个请求都向服务器询问特定页面(即从0 开始的页码和从0 开始的行号,要求page_number=1将行 page_number * 100 返回到 100+(page_number * 100))。

    不完整的页面(少于 100 行)将停止循环。

    如您所见,这种设计将使用较小的 SQL 请求(请求 X 到 Y 行而不是整个数据),感觉对用户响应更快,并且允许用户开始阅读数据,甚至更多数据正在传入。

    【讨论】:

      【解决方案3】:

      在您的脚本中,您可以使用setInterval 将 ajax 请求设置为每 x 毫秒关闭一次,并且在您的 timeOut 执行的函数中,您可以有一个条件来取消超时执行。看起来像这样:

      intervalId = setInterval( function () {
          {{ Do your ajax thing, catch response in variable called data }}
          if (data.content !== "still processing") {
              doWhateverThingWithData(data);
              clearInterval(intervalId);
          }
      }, 3000)
      

      最后的 3000 是每次执行之间的毫秒数。

      编辑:不小心使用了 setTimeout 和 clearTimeout 而不是 setInterval 和 clearInterval

      【讨论】:

      • 对不起哥们,但我投了反对票,因为这样做不切实际。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2011-08-20
      相关资源
      最近更新 更多