Есть ли способ сбросить html на провод в Синатре - PullRequest
6 голосов
/ 12 июня 2010

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

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

1 Ответ

7 голосов
/ 12 июня 2010

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

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...