class Eventkit::Promise
Constants
- VERSION
Attributes
task_scheduler[R]
value[R]
Public Class Methods
new(task_scheduler) { |self| ... }
click to toggle source
# File lib/eventkit/promise.rb, line 7 def initialize(task_scheduler) @on_fullfiled = [] @on_rejected = [] @state = :pending @task_scheduler = task_scheduler @resolved_with_promise = false yield self if block_given? end
Public Instance Methods
catch(&handler)
click to toggle source
# File lib/eventkit/promise.rb, line 82 def catch(&handler) self.then(nil, handler) end
on_fullfiled(&handler)
click to toggle source
# File lib/eventkit/promise.rb, line 74 def on_fullfiled(&handler) self.then(handler) end
on_rejected(&handler)
click to toggle source
# File lib/eventkit/promise.rb, line 78 def on_rejected(&handler) self.then(nil, handler) end
pending?()
click to toggle source
# File lib/eventkit/promise.rb, line 16 def pending? @state == :pending end
reject(value)
click to toggle source
# File lib/eventkit/promise.rb, line 67 def reject(value) return unless pending? && !@resolved_with_promise run_rejection(value) self end
rejected?()
click to toggle source
# File lib/eventkit/promise.rb, line 24 def rejected? @state == :rejected end
resolve(value)
click to toggle source
# File lib/eventkit/promise.rb, line 58 def resolve(value) fail TypeError, 'Promised resolved with itself' if self == value return unless pending? && !@resolved_with_promise run_resolution(value) self end
resolved?()
click to toggle source
# File lib/eventkit/promise.rb, line 20 def resolved? @state == :resolved end
then(on_fullfiled_handler = nil, on_rejected_handler = nil)
click to toggle source
# File lib/eventkit/promise.rb, line 28 def then(on_fullfiled_handler = nil, on_rejected_handler = nil) promise = Promise.new(task_scheduler) add_on_fullfiled { |value| begin if on_fullfiled_handler promise.resolve(on_fullfiled_handler.to_proc.call(value)) else promise.resolve(value) end rescue => error promise.reject(error) end } add_on_rejected { |value| begin if on_rejected_handler promise.resolve(on_rejected_handler.to_proc.call(value)) else promise.reject(value) end rescue => error promise.reject(error) end } promise end
Private Instance Methods
add_on_fullfiled(&handler)
click to toggle source
# File lib/eventkit/promise.rb, line 88 def add_on_fullfiled(&handler) if resolved? schedule_execution(handler) else @on_fullfiled << handler end end
add_on_rejected(&handler)
click to toggle source
# File lib/eventkit/promise.rb, line 96 def add_on_rejected(&handler) if rejected? schedule_execution(handler) else @on_rejected << handler end end
run_rejection(value)
click to toggle source
# File lib/eventkit/promise.rb, line 120 def run_rejection(value) @value = value @on_rejected.each(&method(:schedule_execution)) @state = :rejected end
run_resolution(value)
click to toggle source
# File lib/eventkit/promise.rb, line 104 def run_resolution(value) if value.respond_to?(:then) begin value.then(->(v) { run_resolution(v) }, ->(v) { run_rejection(v) }) @resolved_with_promise = true rescue => e reject(e) end else @state = :resolved @value = value @on_fullfiled.each(&method(:schedule_execution)) end end
schedule_execution(handler)
click to toggle source
# File lib/eventkit/promise.rb, line 126 def schedule_execution(handler) task_scheduler.schedule_execution { handler.call(value) } end