【发布时间】:2015-10-22 11:04:24
【问题描述】:
我之前看到过这个问题,但我很好奇使用 sinatra 来完成这个问题。认识到sinatra already has a streaming method,我认为解决方案已经完成了 80%。
这些是一些类似的问题供参考:
通用重定向标准输出: Streaming stdout to a web page
使用 sinatra 流式传输标准输出(不适用于我): Sinatra 1.3 Streaming w/ Ruby stdout redirection
这是我想要完成的一个示例(为清楚起见进行了简化):
require 'sinatra'
require 'thin'
get '/' do
stream do |out|
out << method_that_puts
end
end
def method_that_puts
puts 'I would like...'
sleep 1.0
puts 'to display this...'
sleep 1.0
puts 'on a web page!'
end
编辑: 最好的例子是 travis-ci,它是 also built with sinatra。他们正在将标准输出重定向到构建页面......这怎么可能?
更新:
感谢到目前为止的帮助,我有一个半途而废的解决方案。我目前正在将$stdout 保存到StringIO 的新实例中,然后再显示它。但是,这不是答案。对于长时间运行的脚本(即 travis-ci 构建),等待整个脚本完成然后显示 $stdout 是荒谬的。需要弄清楚如何在它出现时对其进行流式传输......
这是我目前所拥有的:
foo = StringIO.new
$stdout = foo
get '/' do
stream do |out|
method_that_puts
out.puts $stdout.string
end
end
def method_that_puts
puts 'I would like...'
sleep 1.0
puts 'to display this...'
sleep 1.0
puts 'on a web page!'
end
【问题讨论】:
-
Ruby Sinatra 是服务器端,这意味着你不能像那样不刷新就更新页面。要么刷新,要么可以使用客户端 JavaScript 或 jQuery,这比您想象的要容易。此外,要将输出定向到网页,您必须将值嵌入 *.erb 文件并运行 WEBrick 服务器或使用主机。
-
你确定这不可能吗?我的印象是可以为特定路线处理流,并在流中仍有数据时继续“加载”。没有刷新——这是页面的初始加载。
-
捕获输出并将其作为视图值提供。
-
可以实时做到吗?我想也许将
$stdout保存到一个变量并传递给一个视图,但它不会同时显示method_that_pus。 -
据我所知,由于 Ruby Sinatra 是服务器端,因此没有这样的方法可以完成您想要完成的任务。如果您想要更新,请使用客户端 Javascript。