ctp*_*ctp 4 ruby callback eventmachine
我正在玩EventMachine已有几天了,它有一个陡峭的学习曲线恕我直言;-)我尝试通过触发HttpHeaderCrawler.query()在回调中返回一个哈希.但是我在这种情况下得到的不是hash {'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
Run Code Online (Sandbox Code Playgroud)
此代码段产生以下输出:
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>
Run Code Online (Sandbox Code Playgroud)
我认为问题是#query返回http.callback,它返回http对象本身,而它应该返回self,即HttpHeaderCrawler.看看这是否有效.
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
self
end
Run Code Online (Sandbox Code Playgroud)