4

使用赛璐珞时,如何在异步方法完成其工作(回调)时收到通知?

示例代码:

  require 'celluloid/autostart'

  class Test
    include Celluloid

    def initialize(aaa)
      @aaa = aaa
    end

    def foo
      sleep 20
      @bbb = 'asdasd'
    end

    def bar
      "aaa is: #{@aaa}, bbb is: #{@bbb}"
    end
  end
  x = Test.new 111
  x.async.foo

我想在 foo 内部的工作完成后立即收到通知。

4

2 回答 2

1

我推荐使用观察者模式。赛璐珞通过通知支持这一点。查看 wiki 获取一些信息: https ://github.com/celluloid/celluoid/wiki/Notifications

这是一个工作代码示例:

require 'rubygems'
require 'celluloid/autostart'

class Test
  include Celluloid
  include Celluloid::Notifications

  def initialize(aaa)
    @aaa = aaa
  end

  def foo
    sleep 2
    @bbb = 'asdasd'
    publish "done!", "Slept for 2 seconds and set @bbb = #{@bbb}"
  end

  def bar
    "aaa is: #{@aaa}, bbb is: #{@bbb}"
  end
end

class Observer
  include Celluloid
  include Celluloid::Notifications

  def initialize
    subscribe "done!", :on_completion
  end

  def on_completion(*args)
    puts "finished, returned #{args.inspect}"
  end
end


y = Observer.new
x = Test.new 111
x.async.foo

sleep 3
于 2013-08-14T14:29:49.930 回答
0

现在我认为新的条件功能是处理这个问题的首选方式。

赛璐珞 wiki 页面上有关条件的示例太大,无法在此处粘贴,但简单地说,您可以创建一个 Condition 对象,该对象在完成后由调用的方法发出信号。调用者可以简单地等待,直到满足条件。

于 2013-10-23T11:00:44.177 回答