0

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

它工作正常,但我预计会得到一个错误,因为当方法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 连接一起消失吗?

4

1 回答 1

0

Ruby 块很有趣,因为它们包含对定义它们的范围的绑定。

这意味着您的 deferable 绑定在块内并且可用于块,即使该块在其他地方/稍后执行。

于 2013-02-06T17:40:31.967 回答