这个eventmachine代码是如何工作的

时间:2013-02-06 17:06:37

标签: ruby eventmachine

在下面的代码中,我从redis队列中读取并在redis操作完成时触发本地可延迟变量d上的回调。

它工作正常,但我希望得到一个错误,因为当方法f返回时,变量d超出了范围。或者是吗?

为什么这样做?是因为使用d的块创建闭包而这些闭包使d保持活着?

require 'em-hiredis'

def f
  d = EM::DefaultDeferrable.new

  EM::Hiredis.connect.blpop('abcdef', 5).
    callback {|x| d.succeed x}.
    errback {|e| d.fail e}

  d.
    callback {|x| puts "value=#{x}"}.
    errback {|e| puts "error #{e}"}

  return nil
end

EM.run {f}

编辑:请注意EM :: Hiredis实例也是本地的,并且块附加到它。当f返回时,这些块不应该与redis连接一起消失吗?

1 个答案:

答案 0 :(得分:0)

Ruby块很有意思,因为它们包含对它们在其中定义的范围的绑定。

这意味着你的deferrable被绑定在块中并可用于块,即使块在其他地方/之后执行也是如此。