拿下面的代码....
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
罗伊斯