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