ma1*_*w28 4 ruby asynchronous block net-http
是否Net::HTTP支持异步语法?
我正在寻找类似下面代码的东西。
在Net::HTTP收到来自服务器的响应(在这种情况下error为nil)或连接到服务器时遇到错误(在这种情况下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
Run Code Online (Sandbox Code Playgroud)
以下问题提供了答案,但我正在寻找基于块的解决方案。
看看eventmachine和em-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
Run Code Online (Sandbox Code Playgroud)
em-http-requestGithub页面上有一个很好的使用纤维的例子。
编辑:我还建议阅读http://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/