em-synchrony文档链接到this article,暗示这个代码带有光纤:
require 'eventmachine'
require 'fiber'
require 'em-http-request'
def http_get(url)
f = Fiber.current
http = EventMachine::HttpRequest.new(url).get
# resume fiber once http call is done
http.callback { f.resume(http) }
http.errback { f.resume(http) }
return Fiber.yield
end
EventMachine.run do
Fiber.new {
page = http_get('http://myurl')
puts "Fetched page: #{page.response}"
EventMachine.stop
}.resume
end
...相当于使用em-synchrony这个更简单的代码:
require 'em-synchrony'
require 'em-http-request'
EventMachine.synchrony do
page = EventMachine::HttpRequest.new("http://myurl").get
p "No callbacks! Fetched page: #{page.response}"
EventMachine.stop
end
然而,运行两者会产生不同的结果。在第一个光纤产生,直到HTML响应返回,而第二个似乎立即打印而不等待响应,因此打印的响应是空的。我是误读还是输入错误,或者文章实际上是在暗示错误的东西?
答案 0 :(得分:2)
您需要使用知道如何使用EventMachine::HttpRequest
的{{1}}扩展版。
更改
EventMachine.synchrony
到
require 'em-http-request'
这反过来将需要“em-http-request”,并将修补require "em-synchrony/em-http"
#get, #head, #post, #delete, #put
方法以与Fibers一起使用。