class MrDarcy::Promise::EM

EventMachine implementation of promises.

See MrDarcy::Promise::Base for method documentation.

Public Class Methods

new(*args) click to toggle source
Calls superclass method MrDarcy::Promise::Base::new
# File lib/mr_darcy/promise/em.rb, line 13
def initialize *args
  Kernel::raise "EventMachine driver is unsupported on JRuby, sorry" if RUBY_ENGINE=='jruby'
  unless EventMachine.reactor_running?
    ::Thread.new { EventMachine.run }
    ::Thread.pass until EventMachine.reactor_running?
  end
  @wait_lock = Mutex.new
  @wait_cond = ConditionVariable.new
  @wait_lock.lock
  deferrable_adapter.callback &method(:do_resolve)
  deferrable_adapter.errback &method(:do_reject)
  super
end

Public Instance Methods

final() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 42
def final
  wait_if_unresolved
  self
end
reject(value) click to toggle source
# File lib/mr_darcy/promise/em.rb, line 32
def reject value
  deferrable_adapter.set_deferred_status :failed, value
  self
end
resolve(value) click to toggle source
# File lib/mr_darcy/promise/em.rb, line 27
def resolve value
  deferrable_adapter.set_deferred_status :succeeded, value
  self
end
result() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 37
def result
  wait_if_unresolved
  value
end

Private Instance Methods

deferrable_adapter() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 53
def deferrable_adapter
  @deferrable_adapter ||= DeferrableAdapter.new
end
did_reject(value) click to toggle source
# File lib/mr_darcy/promise/em.rb, line 73
def did_reject value
  notify_waiting
end
did_resolve(value) click to toggle source
# File lib/mr_darcy/promise/em.rb, line 69
def did_resolve value
  notify_waiting
end
generate_child_promise() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 65
def generate_child_promise
  ChildPromise.new driver: :em
end
notify_waiting() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 77
def notify_waiting
  EventMachine.defer { @wait_cond.signal }
end
resolve_or_reject_child_as_needed() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 61
def resolve_or_reject_child_as_needed
  EventMachine.defer { super }
end
schedule_promise(&block) click to toggle source
# File lib/mr_darcy/promise/em.rb, line 57
def schedule_promise &block
  EventMachine.defer block
end
wait_if_unresolved() click to toggle source
# File lib/mr_darcy/promise/em.rb, line 49
def wait_if_unresolved
  @wait_cond.wait @wait_lock if unresolved?
end