2013-04-16 94 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

罗伊斯