2013-04-16 129 views
0

在我見過的所有eventmachine代碼中,在實際調用方法之後聲明瞭回調/錯誤回覆。eventmachine回調聲明訂單

這裏有一個簡單的例子:

about = EventMachine::HttpRequest.new('http://google.ca/search?q=eventmachine').get 
about.callback { # callback nesting, ad infinitum } 
about.errback { # error-handling code } 

爲什麼回調和errorbacks宣佈? EM :: HttpRequest是不是已經完成了W /某種成功或錯誤狀態? EM如何保證實際發現回調和錯誤回覆?

+0

它我在回調聲明之前不可能執行該請求 – fl00r

回答

1
  1. .get調用只設置請求。 The get request方法EM::HttpRequest模塊。

  2. EM::HttpRequest使用EM::Deferrable module這是一種開關。

將這兩項加在一起,您將獲得一個功能,請求首先被構建,並等待收到響應。因此,對於循環的第一次迭代,連接被建立,回調被註冊,並且當接收到響應時,將在下一次迭代/每當接收到響應時處理,set_deferrable_status被設置爲:succeeded:failed並執行相應的回調/ errback。

0

看看下面的代碼....

http = EM::HttpRequest.new('http://google.com').get 

http.callback {puts "it was a great call"} 
http.errback { puts "it was a bad call" } 

你可能會認爲,如果異步請求發生比我們可以設置回調速度有可能回調將不會被調用。 請求正在異步發生,所以我們可能認爲這是一種可能性。但事實並非如此。如果我們在實際設置回調的時間段之間放置了一些非常長的運行代碼,該怎麼辦?我會介紹並顯示回調仍然有效。

http = EM::HttpRequest.new('http://google.com').get 

#Some really long running code 
100000000000.times do 
    #some really long running code 
end 

http.callback {puts "it was a great call"} 
http.errback { puts "it was a bad call" } 

在這種情況下,請求在很長的運行代碼完成之前完成,但回調仍將被調用?爲什麼? 原因是因爲HttpRequest是可延遲的。它從它繼承。即使可延期是可以運行asyc的東西。Defferables有狀態。成功或失敗,我們仍然可以在一個名爲http的變量中引用這個無法解決的問題。

當我們調用http.callback {「puts」這是一個很好的調用}}我們立刻檢查這個可疑的狀態,在這種情況下http是否成功,如果是,立刻調用回調函數。除此之外,我們可以設置它,以便每當它以「成功」狀態結束時,它就會打電話給它,這很簡單,只要我們有一個可以參考的參數,我們就可以隨時設置回調。

我的猜測是確認時,我居然拍了一下供Defferable的源代碼。 http://eventmachine.rubyforge.org/EventMachine/Deferrable.html#callback-instance_method

羅伊斯