ruby - 有没有办法将 html 刷新到 Sinatra 中的线路

标签 ruby sinatra

我有一个 Sinatra 应用程序,它有一个长时间运行的进程(网络抓取工具)。我希望应用程序在爬虫运行时而不是在结束时刷新爬虫进度的结果。

我已经考虑过 fork 请求并使用 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 中间件)。从路由 block 返回的结果可以简单地响应 each。然后,Rack 处理程序将使用一个 block 调用 each,并在该 block 中将正文的给定部分刷新到客户端。

所有 rack 响应都必须始终响应 each 并始终将字符串传递给给定的 block 。如果您只返回一个字符串,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

关于ruby - 有没有办法将 html 刷新到 Sinatra 中的线路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027435/

相关文章:

ruby - 如何在纯 Ruby 中按 DateTime 的日期数组分组?

ruby - 如何使用带有 HTTP 基本身份验证的 Passenger(在 Apache 上)部署多个 Rack/Sinatra 应用程序?

ruby-on-rails - 使用 include 比较两个数组?

ruby - airbrake notify_airbrake 方法在 Controller 中不起作用

ruby-on-rails - 使用( unicorn 和 nginx)在 Rails 应用程序子 uri 上部署 sinatra 应用程序

ruby - 为每个请求创建新的 sinatra 对象,但初始化仅调用一次

facebook - Sinatra 使用 gem oauth2 登录 Facebook OAuth 2.0

ruby - 很多 H17 Heroku 错误

ruby-on-rails - 在 Ubuntu 10.04 上使用 graphicsmagick 安装 rmagick 2.13.1

ruby - 如何仅打印 6 位数字的 float - Ruby