0

在我见过的所有 eventmachine 代码中,回调/错误返回是在方法的实际调用之后声明的。

这是一个简单的例子:

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

为什么要在AFTER声明回调和错误返回?EM::HttpRequest 不可能已经完成并带有某种成功或错误状态吗?EM 如何保证回调和错误返回被实际捕获?

4

2 回答 2

1
  1. .get调用仅设置请求。 模块中的get请求方法EM::HttpRequest

  2. EM::HttpRequest使用类似于开关的EM::Deferrable模块。

将这两者加在一起,您将获得一个功能,其中首先构建请求并等待收到响应。因此,对于EM.run do..end循环的第一次迭代,建立连接,注册回调,当收到响应时,将在下一次迭代中处理/每当收到响应时,set_deferrable_status设置为:succeededor:failed和相应的回调/errback 被执行。

于 2013-04-16T18:54:29.400 回答
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 是可延迟的。它继承自它。尽管 Deferable 是可以运行 asyc 的东西,但 Defferables 有一个状态。成功或失败,我们仍然在一个名为 http 的变量中引用了该可延迟对象。

当我们调用 http.callback {"puts "it was a great call"} 时,我们立即检查 deffereable 的状态,在本例中为 http,是否为成功。如果是,立即调用回调。否则设置它这样当 defferable 以“成功”状态结束时调用它。就这么简单。只要我们有对该 defferable 的引用,我们就可以随时设置回调。

当我实际查看 Defferable 的源代码时,我的猜测得到了证实。 http://eventmachine.rubyforge.org/EventMachine/Deferrable.html#callback-instance_method

罗伊斯

于 2013-04-17T18:03:22.690 回答