Есть ли способ сбросить HTML к проводу в Sinatra

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

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

6
задан Matt 12 June 2010 в 04:04
поделиться

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). Результат, возвращенный из блока маршрута, может просто отвечать на каждый . Затем обработчик стойки вызовет каждый с блоком и в этом блоке передаст клиенту заданную часть тела.

Все ответы стойки должны всегда отвечать на каждый и всегда передавать строки заданному блоку. 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
7
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: