Class: Celluloid::Promise::DeferredPromise
- Defined in:
- lib/celluloid-promise/q.rb
Overview
A new promise instance is created when a deferred instance is created and can be retrieved by calling deferred.promise
Instance Method Summary collapse
-
#initialize(defer, reactor) ⇒ DeferredPromise
constructor
A new instance of DeferredPromise.
-
#then(callback = nil, errback = nil, &blk) ⇒ Promise
regardless of when the promise was or will be resolved / rejected, calls one of the success or error callbacks asynchronously as soon as the result is available.
Constructor Details
#initialize(defer, reactor) ⇒ DeferredPromise
Returns a new instance of DeferredPromise.
31 32 33 34 35 36 37 |
# File 'lib/celluloid-promise/q.rb', line 31 def initialize(defer, reactor) raise ArgumentError unless defer.is_a?(Deferred) super() @defer = defer @reactor = reactor end |
Instance Method Details
#then(callback = nil, errback = nil, &blk) ⇒ Promise
regardless of when the promise was or will be resolved / rejected, calls one of the success or error callbacks asynchronously as soon as the result is available. The callbacks are called with a single argument, the result or rejection reason.
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/celluloid-promise/q.rb', line 46 def then(callback = nil, errback = nil, &blk) result = ::Celluloid::Actor[:Q].defer(@reactor) callback ||= blk wrappedCallback = proc { |val| begin if callback.nil? result.resolve(val) else result.resolve(callback.call(val)) end rescue => e #warn "\nUnhandled exception: #{e.message}\n#{e.backtrace.join("\n")}\n" result.reject(e); end } wrappedErrback = proc { |reason| begin if errback.nil? result.resolve(ResolvedPromise.new(@reactor, reason, true)) else result.resolve(errback.call(reason)) end rescue => e #warn "Unhandled exception: #{e.message}\n#{e.backtrace.join("\n")}\n" result.reject(e); end } # # Schedule as we are touching shared state # Everything else is locally scoped # @reactor.async.perform do pending_array = pending if pending_array.nil? value.then(wrappedCallback, wrappedErrback) else pending_array << [wrappedCallback, wrappedErrback] end end result.promise end |