在我看到的所有事件机代码中,回调/错误回退都是在方法的实际调用之后声明的。
下面是一个简单的例子:
about = EventMachine::HttpRequest.new('http://google.ca/search?q=eventmachine').get
about.callback { # callback nesting, ad infinitum }
about.errback { # error-handling code }为什么之后会声明回调和错误回退?难道EM::HttpRequest不可能已经完成了某种成功或错误状态吗?EM如何保证回调和错误回退实际上被捕获?
发布于 2013-04-16 18:54:29
发布于 2013-04-17 18:03:22
取以下代码..。
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是一种可以运行的东西,但会有一个状态。成功或失败,我们仍然可以在一个名为http的变量中引用可推迟的内容。
当我们调用http.callback {“进行”时,我们立即检查可取消调用的状态(在本例中是http )是否成功。如果是,则立即调用回调。否则设置它,以便当它以“成功”状态结束时,令人讨厌的调用它。这很简单。只要我们引用了该可撤销的调用,我们就可以随时设置回调。
我的猜测得到了证实,当我实际查看了Defferable的源代码时。method
罗伊斯
https://stackoverflow.com/questions/16042144
复制相似问题