class EmAlldone

Not a genuine Deferrable in that it doesn’t include EM::Deferrable. Callbacks set will be run when all the passed in deferrables have completed with either success or failure. Doesn’t support errbacks.

Public Class Methods

new(*deferrables, &block) click to toggle source
# File lib/em_alldone.rb, line 49
def initialize(*deferrables, &block)
  deferrables = deferrables.flatten
  raise ArgumentError, "Must provide at least one argument" unless deferrables.size > 0
  deferrables.each do |d|
    raise ArgumentError, "All arguments must be deferrables, but #{d.inspect} doesn't." unless d.respond_to?(:callback) && d.respond_to?(:errback)
  end

  @deferrable = deferrables[-1]

  if deferrables.size > 1
    @recurse = EmAlldone.new deferrables[0...-1]
  end

  self.callback &block if block
end
with(deferrables, *args, &block) click to toggle source

Returns an instance. However, it ensures that when the callback is called it is called with the specified arguments.

# File lib/em_alldone.rb, line 42
def self.with(deferrables, *args, &block)
  deferrables = deferrables.flatten
  deferrables << BasicDeferrable.new
  deferrables[-1].succeed *args
  new(deferrables, &block)
end

Public Instance Methods

callback(&block) click to toggle source
# File lib/em_alldone.rb, line 65
def callback &block
  current_proc = Proc.new do
    @deferrable.callback &block
    @deferrable.errback  &block
  end

  if @recurse
    @recurse.callback &current_proc
  else
    current_proc.call
  end
end