gpt4 book ai didi

javascript - Rails Ajax - 在一个 Action 中呈现多个响应

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:55 28 4
gpt4 key购买 nike

我的 Rails 应用程序中有一个 ajax 请求,它从我的 Controller 操作中返回一个变量。在 Controller Action 中,我有一个循环,可能需要一些时间才能完成。

Controller

def myAction
$j = 1
until $j > list_size do
array << { :foo => $j }
$j +=1;
end
@myvariable = array.to_json
end

myAction.js.erb

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

我希望能够将循环的每个阶段的结果呈现给 js.erb 部分,而不是等待循环完成。这是否可能在不中断循环并在循环完成之前过早结束操作的情况下进行?也许是这样的(错误的伪代码):

Controller

def myAction
$j = 1
until $j > list_size do
array << { :foo => $j }
render array.to_json
$j +=1;
end
end

myAction.js.erb

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

最佳答案

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

所以,你运气不好,你将不得不使用 Rail 4 及更高版本中提供的 ActionController::Live。 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

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

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

请使用以下资源了解更多关于流媒体、SSE 和事件源的信息:

关于javascript - Rails Ajax - 在一个 Action 中呈现多个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21256952/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com