Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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
Jquery Rails ajax请求周期性地进行,直到得到具体的答复_Jquery_Ruby On Rails_Ruby_Ajax_Heroku - Fatal编程技术网

Jquery Rails ajax请求周期性地进行,直到得到具体的答复

Jquery Rails ajax请求周期性地进行,直到得到具体的答复,jquery,ruby-on-rails,ruby,ajax,heroku,Jquery,Ruby On Rails,Ruby,Ajax,Heroku,我正在使用ajax刷新页面上的表,代码如下 true,:class=>“btn btn成功btn xs”%> 在服务器上,页面重新加载会启动一个进程来生成一个大表。 目前,我从服务器发送一个简单的“仍在处理”,如果大表还没有准备好,并且如果大表已经准备好,则发送大量html 问题1。如何开始定期ajax刷新? 问题2。如何解释服务器结果以停止定期ajax刷新?在脚本中,您可以使用setInterval将ajax请求设置为每x毫秒发出一次,并且在超时执行的函数中,您可以使用取消超时执行的条件。看起

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

true,:class=>“btn btn成功btn xs”%> 在服务器上,页面重新加载会启动一个进程来生成一个大表。 目前,我从服务器发送一个简单的“仍在处理”,如果大表还没有准备好,并且如果大表已经准备好,则发送大量html

问题1。如何开始定期ajax刷新?
问题2。如何解释服务器结果以停止定期ajax刷新?

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

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

虽然@mb_s88的答案是对您的问题的直接答案(我甚至对它投了更高的票),但我建议您重新考虑工作流

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

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

例如:

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

因此,我建议在加载下一个“页面”时显示现有数据,每个请求请求服务器指定一个页面(即,对于从
0
开始的页码和从0开始的行号,请求
page\u number=1
将返回行
page\u number*100
100+(page\u number*100)

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


如您所见,此设计将使用较小的SQL请求(请求行X到Y,而不是整个数据),让用户感觉更具响应性,并允许用户在收到更多数据时开始读取数据。

由于以下几个原因,您的请求很棘手:

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

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

因此


如何开始定期ajax刷新

你没有

您有两种选择:

  • Ajax长轮询
  • Ajax回调
  • 如下所述:

    (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追加响应。这通常用于极低负载的实例(因为您正在向服务器发送持续的请求),例如聊天应用程序、评论等

    简言之,长轮询是最适合的。这是一种使用JS实现近实时功能的快速方法。您可以使用它来提供非常低级的信息,例如聊天响应、通知等

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

    --

    下一个选项是使用

    这就是将Ajax响应封装在函数中的本质,允许同步处理异步请求。听起来很复杂?如果您了解Ajax是如何工作的,就不太可能了

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

    这是一个标准的“同步”请求,也是所有web浏览器的工作方式

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

    AJAX使您能够绕过这一点,增加了将请求发送到范围之外的能力。这样做的好处包括:动态页面更新、通知、页面上应用的新信息

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

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

    这使您能够发送ajax请求并“等待”响应。这与设置“synchronous:true”相反,后者会冻结浏览器


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

    使用Ajax回调并等待响应

    如果它太大,就把它分成几页(按照
    @myst的回答)


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

    对不起,伙计,我投了反对票,因为这样做不实际。提供的信息太少,无法提供适当的反馈-请参阅
    $(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)
        });
    });