eventmachine回调声明顺序

时间:2013-04-16 16:21:00

标签: ruby eventmachine

在我看过的所有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如何保证回调和错误回送实际被捕获?

2 个答案:

答案 0 :(得分:1)

  1. .get来电只会设置请求。 EM::HttpRequest模块中的The get request方法。

  2. EM::HttpRequest使用EM::Deferrable module,这是一种转换。

  3. 将这两者结合在一起,您将获得首次构建请求的功能,并等待收到响应。因此,对于EM.run do..end循环的第一次迭代,建立连接,注册回调,并且在接收到响应时,将在下一次迭代中处理/每当收到响应时,{{1设置为set_deferrable_status:succeeded并执行相应的回调/错误回送。

答案 1 :(得分: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是一个Deferrable。它继承了它。即使Deferrable是可以运行的东西asyc Defferables有一个地位。成功或失败,我们仍然在一个名为http的变量中引用该变量。

当我们打电话给http.callback {" put"这是一个很棒的电话"}我们立即检查以查看deffereable的状态,在这种情况下是http,是否成功。如果是,立即调用回调。否则设置它,以便当它成功完成"成功时,defiable会调用它。状态。就这么简单。只要我们引用该defiable,我们就可以随时设置回调。

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

劳斯莱斯