首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在Sinatra中将html刷新到网络上?

有没有办法在Sinatra中将html刷新到网络上?
EN

Stack Overflow用户
提问于 2010-06-12 12:05:00
回答 1查看 1.6K关注 0票数 6

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

我曾考虑过使用ajax分叉请求并做一些花哨的事情,但这是一个非常基本的单页应用程序,它只需要在发生时将日志输出到浏览器即可。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-12 17:27:17

更新(2012-03-21)

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

代码语言:javascript
运行
复制
get '/' do
  stream do |out|
    out << "foo\n"
    sleep 10
    out << "bar\n"
  end
end

老答案

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

所有机架响应必须始终响应each,并始终将字符串传递给给定块。如果你只返回一个字符串,Sinatra会帮你解决这个问题。

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

代码语言:javascript
运行
复制
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方法中:

代码语言:javascript
运行
复制
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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3027435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档