2012-01-25 50 views
1

的EM-同步文檔鏈接到this article這意味着該代碼纖維:EM-同步示例代碼無法正常運行

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-同步:

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響應返回時,光纖產生收益,而第二種似乎不等待響應而立即打印,結果打印的響應爲空。我是誤讀還是誤認,還是文章實際上暗示着錯誤的東西?

回答

2

您需要使用知道如何使用EventMachine.synchrony的擴展版本EventMachine::HttpRequest

變化

require 'em-http-request' 

require "em-synchrony/em-http" 

這反過來要求 「EM-HTTP請求」,將補丁EventMachine::HttpRequest#get, #head, #post, #delete, #put方法與纖維工作。

這裏是the link to source code of em-synchrony/em-http

+0

謝謝。當示例代碼未顯示正確的需求調用時,它總是激怒我。 – iftheshoefritz