class PromiseEm::Promise
JavaScript like promise for EventMachine library
Public Class Methods
new() { |resolve, reject| ... }
click to toggle source
# File lib/promise_em/promise.rb, line 6 def initialize @then_callbacks = [] @catch_callbacks = [] context = self @resolve = create_resolve_proc(context) @reject = create_reject_proc(context) ::EventMachine.next_tick { yield(@resolve, @reject) } if block_given? end
Public Instance Methods
catch(&block)
click to toggle source
# File lib/promise_em/promise.rb, line 20 def catch(&block) @catch_callbacks << block self end
then(&block)
click to toggle source
# File lib/promise_em/promise.rb, line 15 def then(&block) @then_callbacks << block self end
Private Instance Methods
create_reject_proc(context)
click to toggle source
# File lib/promise_em/promise.rb, line 48 def create_reject_proc(context) proc do |*args| reject_callback = @catch_callbacks.shift unless reject_callback context.fail(*args) next end result = reject_callback.call(*args) if result.is_a?(::EventMachine::Deferrable) result.callback { |*cb_args| @reject.call(*cb_args) }.errback { |*cb_args| @reject.call(*cb_args) } else ::EventMachine.next_tick { @reject.call(result) } end end end
create_resolve_proc(context)
click to toggle source
# File lib/promise_em/promise.rb, line 27 def create_resolve_proc(context) proc do |*args| then_callback = @then_callbacks.shift unless then_callback context.succeed(*args) next end begin result = then_callback.call(*args) if result.is_a?(::EventMachine::Deferrable) result.callback { |*callback_args| @resolve.call(*callback_args) }.errback { |*error| @reject.call(*error) } else ::EventMachine.next_tick { @resolve.call(*result) } end rescue StandardError => e ::EventMachine.next_tick { @reject.call(*e) } end end end