module Delayer::Deferred::Deferredable
なんでもDeferred
Constants
- BackTrace
- Callback
- CallbackDefaultNG
- CallbackDefaultOK
Public Instance Methods
call(value = nil)
click to toggle source
Deferredを直ちに実行する
# File lib/delayer/deferred/deferredable.rb, line 23 def call(value = nil) _call(:ok, value) end
callback()
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 36 def callback @callback ||= Callback.new(CallbackDefaultOK, CallbackDefaultNG, BackTrace.new(nil, nil)) end
cancel()
click to toggle source
この一連のDeferredをこれ以上実行しない
# File lib/delayer/deferred/deferredable.rb, line 31 def cancel @callback = Callback.new(CallbackDefaultOK, CallbackDefaultNG, BackTrace.new(nil, nil).freeze).freeze end
fail(exception = nil)
click to toggle source
Deferredを直ちに失敗させる
# File lib/delayer/deferred/deferredable.rb, line 27 def fail(exception = nil) _call(:ng, exception) end
next(&proc)
click to toggle source
このDeferredが成功した場合の処理を追加する。 新しいDeferredのインスタンスを返す
# File lib/delayer/deferred/deferredable.rb, line 12 def next(&proc) _post(:ok, &proc) end
Also aliased as: deferred
trap(&proc)
click to toggle source
このDeferredが失敗した場合の処理を追加する。 新しいDeferredのインスタンスを返す
# File lib/delayer/deferred/deferredable.rb, line 18 def trap(&proc) _post(:ng, &proc) end
Also aliased as: error
Private Instance Methods
_call(stat = :ok, value = nil)
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 55 def _call(stat = :ok, value = nil) begin catch(:__deferredable_success) do failed = catch(:__deferredable_fail) do n_value = _execute(stat, value) if n_value.is_a? Delayer::Deferred::Deferredable n_value.next{ |result| @next.call(result) }.trap{ |exception| @next.fail(exception) } else if defined?(@next) delayer.new{ @next.call(n_value) } else register_next_call(:ok, n_value) end end throw :__deferredable_success end _fail_action(failed) end rescue Exception => exception _fail_action(exception) end end
_execute(stat, value)
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 75 def _execute(stat, value) callback[stat].call(value) end
_fail_action(err_obj)
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 92 def _fail_action(err_obj) if defined?(@next) delayer.new{ @next.fail(err_obj) } else register_next_call(:ng, err_obj) end end
_post(kind, &proc)
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 78 def _post(kind, &proc) @next = delayer.Deferred.new(self) @next.callback[kind] = proc @next.callback.backtrace[kind] = caller(1) if defined?(@next_call_stat) and defined?(@next_call_value) @next.__send__({ok: :call, ng: :fail}[@next_call_stat], @next_call_value) elsif defined?(@follow) and @follow.nil? call end @next end
delayer()
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 51 def delayer self.class.delayer end
register_next_call(stat, value)
click to toggle source
# File lib/delayer/deferred/deferredable.rb, line 88 def register_next_call(stat, value) @next_call_stat, @next_call_value = stat, value self end