gpt4 book ai didi

javascript - 使用 Sinatra 进行流式传输,逐渐更新目的地

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:37:20 25 4
gpt4 key购买 nike

我有一个 Sinatra 网络应用程序,我非常想通过某些功能的流式更新来增强它。不过现在,我只是想学习使用流数据的方法,这是我以前从未做过的。我有以下简单的测试代码:

在 Sinatra 中:

get '/foo' do
stream do |out|
10.times do
out.puts "foo"
out.flush
sleep 1
end
end
end

get '/bar' do
erb :bar
end

bar.erb中:

<body>
<div class="stream">
nothing.
</div>
</body>

<script type="text/javascript" charset="utf-8">
$(document).ready( function() {
$.get('/foo', function(html) {
$(".stream").html(html);
});
});
</script>

我并不感到惊讶这没有做我想做的事情,即在写入每个“foo”时获取它并动态更新页面。相反,大约 10 秒内没有任何反应,然后我得到 foo foo foo foo foo foo foo foo foo foo foo

我的问题是,如何在 ERB 模板(使用 Ruby、jQuery 或其他方式)中提取提供的流式数据,而不是阻塞直到所有数据都被收集并一次性全部输出?

最佳答案

Sinatra 操作包装了整个 HTTP 响应周期 - 这意味着它会等到操作完成后再关闭请求,此时浏览器认为数据“完整”且“良好”可供使用。您在上面的代码中创建的只是一个非常非常慢的 Sinatra 操作。

您正在寻找的技术是 Websockets,大多数现代浏览器都支持它,并在每个客户端和服务器之间提供双向通信 channel 。 websocket channel 是通过“升级”常规 HTTP 请求创建的。在客户端不支持 Web 套接字的情况下,可以使用 HTTP 长轮询等技术来模拟它们(其中请求保持打开状态,没有响应,直到有可用数据 - 此时数据被分流到响应 channel ,响应 channel 已关闭,客户端应打开一个新请求以获取任何进一步的数据)。

您可以使用 EventMachine 和 EM-Websocket 在您的 Ruby 应用程序中进行此设置.另一种选择是 Socky我相信它提供了 javascript 客户端和 Ruby 服务器。

关于javascript - 使用 Sinatra 进行流式传输,逐渐更新目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903134/

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