Я играю с EventMachine уже несколько дней, у которого ИМХО крутая кривая обучения ;-) Я пытаюсь вернуть хэш, вызывая HttpHeaderCrawler.query(), который мне нужен в обратном вызове. Но в этом случае я получаю не хэш {'http_status' => xxx, 'http_version' => xxx}, а сам объект EventMachine::HttpClient.
Я хочу сохранить блок EM.run в чистоте и хочу выполнять всю логику в собственных классах/модулях, так как же вернуть такое значение в основной цикл, чтобы получить к нему доступ с помощью обратного вызова? Спасибо заранее ;-)
#!/usr/bin/env ruby
require 'eventmachine'
require 'em-http-request'
class HttpHeaderCrawler
include EM::Deferrable
def query(uri)
http = EM::HttpRequest.new(uri).get
http.callback do
http_header = {
"http_status" => http.response_header.http_status,
"http_version" => http.response_header.http_version
}
puts "Returns to EM main loop: #{http_header}"
succeed(http_header)
end
end
end
EM.run do
domains = ['http://www.google.com', 'http://www.facebook.com', 'http://www.twitter.com']
domains.each do |domain|
hdr = HttpHeaderCrawler.new.query(domain)
hdr.callback do |header|
puts "Received from HttpHeaderCrawler: #{header}"
end
end
end
Этот фрагмент выдает следующий результат:
Returns to EM main loop: {"http_status"=>302, "http_version"=>"1.1"}
Received from HttpHeaderCrawler: #<EventMachine::HttpClient:0x00000100d57388>
Returns to EM main loop: {"http_status"=>301, "http_version"=>"1.1"}
Received from HttpHeaderCrawler: #<EventMachine::HttpClient:0x00000100d551a0>
Returns to EM main loop: {"http_status"=>200, "http_version"=>"1.1"}
Received from HttpHeaderCrawler: #<EventMachine::HttpClient:0x00000100d56280>
self.succeed()
иself.fail()
, а в вашем кодеself.
отсутствует. Этого достаточно, чтобы создать проблему? - person sarnold   schedule 27.10.2011