4

是否Net::HTTP支持异步语法?

我正在寻找类似下面代码的东西。

Net::HTTP在收到来自服务器的响应(在这种情况下errornil)或遇到连接到服务器的错误(在这种情况下response是)之后,该块将在主线程上调用nil

Net::HTTP.get('http://stackoverflow.com') do |response, error|
  if error
    puts "Connection error: #{error.message}"
  elsif response.status_code != HTTPOK
    puts "Unexpected status code: #{response.status_code}"
    puts response.body
  else
    puts "Success!"
    puts response.body
  end
end

以下问题提供了答案,但我正在寻找基于块的解决方案。

4

1 回答 1

5

看看eventmachineem-http-request宝石。相当于您上面的代码将是

require 'rubygems'
require 'eventmachine'
require 'em-http'

HTTP_OK = 200

EM.run do
  http = EM::HttpRequest.new('http://example.com').get

  http.errback do
    puts "Connection error: #{http.error}"
    EM.stop
  end

  http.callback do
    if http.response_header.status == HTTP_OK
      puts "Success!"
      puts http.response
    else
      puts "Unexpected status code: #{http.response_header.status}"
    end
    EM.stop
  end
end

em-http-requestGithub 页面上有一个非常好的使用纤维的例子。

编辑:我还建议阅读http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/

于 2012-07-07T08:24:31.833 回答