有没有办法将html冲到Sinatra的电线上

我有一个Sinatra应用程序,具有长时间运行的过程(Web刮刀)。 我希望应用程序在爬虫运行时而不是在结束时刷新爬虫的进度结果。

我已经考虑过请求并使用ajax做一些奇特的事情,但这是一个非常基本的单页面应用程序,它真的需要在浏览器发生时输出日志。 有什么建议?

更新(2012-03-21)

从Sinatra 1.3.0开始,您可以使用新的流API:

get '/' do stream do |out| out << "foo\n" sleep 10 out << "bar\n" end end 

老答案

不幸的是,你没有可以简单地刷新的流(这不适用于Rack中间件)。 从路径块返回的结果可以简单地响应each 。 然后,Rack处理程序将使用块调用each块,并在该块中将正文的给定部分刷新到客户端。

所有机架响应必须始终响应each并始终将字符串传递给给定块。 如果您只是返回一个字符串,Sinatra会为您处理此事。

一个简单的流媒体示例如下:

 require 'sinatra' get '/' do result = ["this", " takes", " some", " time"] class << result def each super do |str| yield str sleep 0.3 end end end result end 

现在,您只需将所有抓取放置在each方法中:

 require 'sinatra' class Crawler def initialize(url) @url = url end def each yield "opening url\n" result = open @url yield "seaching for foo\n" if result.include? "foo" yield "found it\n" else yield "not there, sorry\n" end end end get '/' do Crawler.new 'http://mysite' end