Есть ли способ смыть html на провод в Sinatra

У меня есть приложение Sinatra с длительным процессом (веб-скребок). Я бы хотел, чтобы приложение очистило результаты прогресса искателя, поскольку искатель работает, а не в конце.

Я рассмотрел разветвление запроса и сделать что-то необычное с ajax, но это действительно основное приложение с одним пейджером, которое действительно просто нужно вывести журнал в браузер, как это происходит. Есть предложения?

1 ответов


обновление (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. Обработчик стойки затем вызовет each С блоком и в этом блоке промойте данную часть тела клиенту.

все ответы для всегда отвечать на each и всегда передавайте строки в данный блок. Синатра позаботится об этом для вас, если вы просто вернете строку.

простой пример потоковой передачи будет:

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