Em-synchrony sample code not working as expected

900 views Asked by At

The em-synchrony documentation links to this article which implies that this code with fiber:

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

...is equivalent to this much simpler code using 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

However running the two produces different results. In the first the fiber yields until the HTML response comes back, while the second seems to print immediately without waiting for the response and as a result the printed response is empty. Am I misreading or mistyping, or is the article actually suggesting the wrong thing?

1

There are 1 answers

1
Aliaksei Kliuchnikau On BEST ANSWER

You need to use extended version of EventMachine::HttpRequest that knows how to work with EventMachine.synchrony.

Change

require 'em-http-request'

to

require "em-synchrony/em-http" 

This in turn will require "em-http-request" and will patch #get, #head, #post, #delete, #put methods of EventMachine::HttpRequest to work with Fibers.

Here is the link to source code of em-synchrony/em-http.