首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件机回调声明顺序

事件机回调声明顺序
EN

Stack Overflow用户
提问于 2013-04-16 16:21:00
回答 2查看 259关注 0票数 0

在我看到的所有事件机代码中,回调/错误回退都是在方法的实际调用之后声明的。

下面是一个简单的例子:

代码语言:javascript
复制
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如何保证回调和错误回退实际上被捕获?

EN

回答 2

Stack Overflow用户

发布于 2013-04-16 18:54:29

  1. .get调用只设置请求。 request方法在EM::HttpRequest模块中的应用。
  2. EM::HttpRequest使用 module,这是一种交换。

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-17 18:03:22

取以下代码..。

代码语言:javascript
复制
http = EM::HttpRequest.new('http://google.com').get

http.callback {puts "it was a great call"}
http.errback { puts "it was a bad call" }

您可能会认为,如果异步请求发生的速度超过了我们设置回调的速度,那么回调可能永远不会被调用。请求是异步发生的,因此我们可能会认为这是一种可能性。但事实并非如此。如果我们在实际设置回调的时间之间放置一些非常长的运行代码,该怎么办?我将演示并证明回调仍然有效。

代码语言:javascript
复制
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

罗伊斯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16042144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档