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 连接一起消失吗?