Class: EMPromise

Inherits:
Promise
  • Object
show all
Defined in:
lib/em_promise.rb

Defined Under Namespace

Classes: Trampoline

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(deferrable = nil, trampoline: nil) ⇒ EMPromise

Returns a new instance of EMPromise.



66
67
68
69
70
71
72
73
# File 'lib/em_promise.rb', line 66

def initialize(deferrable=nil, trampoline: nil)
	super()
	@trampoline =
		trampoline ||
		Thread.current[:_em_promise_trampoline] ||
		Trampoline.new
	fulfill(deferrable) if deferrable
end

Class Method Details

.all(enumerable) ⇒ Object



114
115
116
117
118
119
120
121
122
# File 'lib/em_promise.rb', line 114

def self.all(enumerable)
	super(enumerable.map { |input|
		if input.respond_to?(:promise)
			input.promise
		else
			input
		end
	})
end

.reject(e) ⇒ Object



100
101
102
# File 'lib/em_promise.rb', line 100

def self.reject(e)
	new.tap { |promise| promise.reject(e) }
end

Instance Method Details

#catch_only(*klasses, filter: ->(*) { false }) ⇒ Object



104
105
106
107
108
109
110
111
112
# File 'lib/em_promise.rb', line 104

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

#classObject

Make sure that self.class.new inherits the trampoline



57
58
59
60
61
62
63
64
# File 'lib/em_promise.rb', line 57

def class
	tramp = @trampoline
	klass = super.dup
	klass.define_singleton_method(:new) do |*args|
		super(*args, trampoline: tramp)
	end
	klass
end

#deferObject



84
85
86
# File 'lib/em_promise.rb', line 84

def defer
	@trampoline.submit { yield }
end

#fulfill(value, bind_defer: true) ⇒ Object



75
76
77
78
79
80
81
82
# File 'lib/em_promise.rb', line 75

def fulfill(value, bind_defer: true)
	if bind_defer && value.is_a?(EM::Deferrable)
		value.callback { |x| fulfill(x, bind_defer: false) }
		value.errback(&method(:reject))
	else
		super(value)
	end
end

#waitObject



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/em_promise.rb', line 88

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
	Trampoline.yield
end