以下のコードでは、redis キューから読み取りd
、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 接続でブロックがなくなるはずではありませんか?