class EMPromise
Public Class Methods
all(enumerable)
click to toggle source
Calls superclass method
# File lib/em_promise.rb, line 103 def self.all(enumerable) super(enumerable.map { |input| if input.respond_to?(:promise) input.promise else input end }) end
new(deferrable=nil, trampoline: nil)
click to toggle source
Calls superclass method
# File lib/em_promise.rb, line 45 def initialize(deferrable=nil, trampoline: nil) super() @trampoline = trampoline || Thread.current[:_em_promise_trampoline] || Trampoline.new fulfill(deferrable) if deferrable end
reject(e)
click to toggle source
# File lib/em_promise.rb, line 89 def self.reject(e) new.tap { |promise| promise.reject(e) } end
Public Instance Methods
catch_only(*klasses, filter: ->(*) { false } { |e| ... }
click to toggle source
# File lib/em_promise.rb, line 93 def catch_only(*klasses, filter: ->(*) { false }) catch do |e| if klasses.find { |klass| e.is_a?(klass) } || filter[e] yield e else EMPromise.reject(e) end end end
class()
click to toggle source
Make sure that self.class.new inherits the trampoline
Calls superclass method
# File lib/em_promise.rb, line 36 def class tramp = @trampoline klass = super.dup klass.define_singleton_method(:new) do |*args| super(*args, trampoline: tramp) end klass end
defer() { || ... }
click to toggle source
# File lib/em_promise.rb, line 63 def defer @trampoline.submit { yield } end
fulfill(value, bind_defer=true)
click to toggle source
Calls superclass method
# File lib/em_promise.rb, line 54 def fulfill(value, bind_defer=true) if bind_defer && value.is_a?(EM::Deferrable) value.callback { |x| fulfill(x, false) } value.errback(&method(:reject)) else super(value) end end
wait()
click to toggle source
# File lib/em_promise.rb, line 67 def wait fiber = Fiber.current resume = proc do EM.next_tick { fiber.resume } end self.then(resume, resume) # We might be in a trampoline, so keep that going tramp = Thread.current[:_em_promise_trampoline] raise "Trampoline already ready?" if tramp&.ready result = nil loop do tramp&.ready = true blk = Fiber.yield result tramp&.ready = false result = blk&.call break unless blk end end