首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby EventMachine -如何从EM::Deferrable返回值到主EM循环?

Ruby EventMachine -如何从EM::Deferrable返回值到主EM循环?
EN

Stack Overflow用户
提问于 2011-10-27 07:51:50
回答 1查看 2.4K关注 0票数 4

我使用EventMachine已经有几天了,它有一个陡峭的学习曲线IMHO ;-)我试图通过触发回调中需要的HttpHeaderCrawler.query()来返回一个哈希。但在这种情况下,我得到的不是散列{'http_status‘=> xxx,'http_version’=> xxx},而是一个EventMachine::HttpClient对象本身。

我希望保持EM.run块的整洁,并希望在自己的类/模块中执行所有逻辑,那么如何将这样的值返回到主循环中,以便通过回调来访问它?事先表示感谢;-)

代码语言:javascript
复制
#!/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

此代码段生成以下输出:

代码语言:javascript
复制
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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-27 11:16:49

我认为问题出在#query返回http.callback,它返回http对象本身,而它应该返回self,即HttpHeaderCrawler。看看这是否起作用。

代码语言:javascript
复制
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
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7910289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档