class MrDarcy::Promise::ChildPromise

A special variety of promise created by Base#then and Base#fail methods.

Attributes

promise[RW]
reject_block[RW]
resolve_block[RW]

Public Class Methods

new(opts={}) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 9
def initialize opts={}
  self.promise = MrDarcy.promise(opts) {}
end

Public Instance Methods

parent_rejected(value) click to toggle source

Called by the parent promise when it rejects.

# File lib/mr_darcy/promise/child_promise.rb, line 27
def parent_rejected value
  begin
    return reject_with value unless handles_reject?

    new_value = result_for :reject, value
    return defer_resolution_via new_value if thenable? new_value
    resolve_with new_value
  rescue Exception => e
    handle_exception e
  end
end
parent_resolved(value) click to toggle source

Called by the parent promise when it resolves.

# File lib/mr_darcy/promise/child_promise.rb, line 14
def parent_resolved value
  begin
    return resolve_with value unless handles_resolve?

    new_value = result_for :resolve, value
    return defer_resolution_via new_value if thenable? new_value
    resolve_with new_value
  rescue Exception => e
    handle_exception e
  end
end

Private Instance Methods

defer_resolution_via(new_promise) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 72
def defer_resolution_via new_promise
  new_promise.then do |value|
    resolve_with value
    value
  end
  new_promise.fail do |exception|
    reject_with exception
    exception
  end
end
handle_exception(e) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 41
def handle_exception e
  if promise.unresolved?
    return reject_with e
  elsif promise.resolved?
    promise.then { raise e }
  elsif promise.rejected?
    promise.fail { raise e }
  end
end
handles_reject?() click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 60
def handles_reject?
  !!reject_block
end
handles_resolve?() click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 64
def handles_resolve?
  !!resolve_block
end
reject_with(exception) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 87
def reject_with exception
  promise.reject exception
end
resolve_with(value) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 83
def resolve_with value
  promise.resolve value
end
result_for(which, value) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 51
def result_for which, value
  block = public_send("#{which}_block")
  if block
    block.call value
  else
    value
  end
end
thenable?(object) click to toggle source
# File lib/mr_darcy/promise/child_promise.rb, line 68
def thenable? object
  object.respond_to?(:then) && object.respond_to?(:fail)
end