class Promise
Public Class Methods
new()
click to toggle source
# File lib/ruby-promises.rb, line 22 def initialize @success_chain = [] @error_chain = [] end
Public Instance Methods
method_missing(method, *args)
click to toggle source
# File lib/ruby-promises.rb, line 47 def method_missing method, *args result.send method, *args end
resolve(arg = nil)
click to toggle source
# File lib/ruby-promises.rb, line 41 def resolve arg = nil _rescue 'can\'t call result twice!' if @started @started = true _apply arg end
then(success = nil, error = nil, &blk)
click to toggle source
# File lib/ruby-promises.rb, line 27 def then success = nil, error = nil, &blk if blk if success.nil? success = blk elsif error.nil? error = blk end end raise ArgumentError.new('the first arg should be callable') unless success.respond_to?(:call) raise ArgumentError.new('the second arg should be callable') unless !error || error.respond_to?(:call) @success_chain << [success, error] self end
Private Instance Methods
_apply(result = nil)
click to toggle source
# File lib/ruby-promises.rb, line 52 def _apply result = nil @result = result unless @success_chain.empty? current = @success_chain.shift @error_chain.unshift current ThenEnv.new(proc {|*r| _apply(*r) }, proc{|*r| _rescue(*r)}). instance_exec(result, ¤t[0]) end @result end
_rescue(err)
click to toggle source
# File lib/ruby-promises.rb, line 63 def _rescue err solved = false @error_chain.map {|_, error| error }.compact.each {|error| error.call err solved = true } raise err unless solved end