Rails Ajax - 在一个动作中呈现多个响应

dia*_*ks2 7 javascript ajax ruby-on-rails

我的rails应用程序中有一个ajax请求,它从我的控制器操作返回一个变量.在控制器动作中,我有一个循环,可能需要一些时间才能通过.

调节器

def myAction
  $j = 1 
  until $j > list_size do
    array <<  {  :foo => $j }   
    $j +=1;
  end  
  @myvariable = array.to_json
end
Run Code Online (Sandbox Code Playgroud)

myAction.js.erb

 var myVariable = JSON.parse("<%= escape_javascript(raw @myvariable) %>");
 for (var k = 0; k < myVariable.length; k++) {
   $("#myDiv").append(myVariable[k].foo);
 }
Run Code Online (Sandbox Code Playgroud)

我希望能够将循环的每个阶段的结果呈现给js.erb partial而不是等待循环完成.这是否可以在不中断循环并在循环结束之前提前结束动作的情况下实现?也许是这样的(伪代码是错误的):

调节器

def myAction
  $j = 1 
  until $j > list_size do
    array <<  {  :foo => $j }   
    render array.to_json
    $j +=1;
  end  
end
Run Code Online (Sandbox Code Playgroud)

myAction.js.erb

 var myVariable = JSON.parse("<%= escape_javascript(raw @myvariable) %>");
 $("#myDiv").append(myVariable.foo);
Run Code Online (Sandbox Code Playgroud)

Cur*_*ind 3

render stream: true将延迟加载查询并允许它们在资源和布局渲染后运行。流式处理仅适用于模板,不适用于任何其他形式(例如 json 或 xml)。

所以,你运气不好,你必须使用ActionController::LiveRail 4 及以上版本中提供的功能。Live 是 ActionController 类中包含的一个特殊模块。它使 Rails 能够显式打开和关闭流。下面是伪代码,经过调整,变得更像 ruby​​ 并避免全局变量:

class MyController < ActionController::Base
  include ActionController::Live
  def action
    (1..list_size).each do |list_item|
      response.stream.write("{  "foo": #{list_item} }")
    end
  ensure
     response.stream.close
  end  
end
Run Code Online (Sandbox Code Playgroud)

上面的代码将从 1 循环到并立即list_size输出每个 list_item 。

要使用它,您应该使用服务器发送的事件。通常,网页必须询问是否有可用的更新。通过服务器发送的事件,更新会自动进行。

请使用以下资源了解有关 bouue Streaming、SSE 和事件源的更多信息: