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
deferred(&proc)
Alias for: next
error(&proc)
Alias for: trap
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
wait(second) click to toggle source

second 秒待って次を実行する

Args

second

待つ秒数(second)

Return

Deferred

# File lib/delayer/deferred/deferredable.rb, line 46
def wait(second)
  self.next{ Thread.new{ sleep(second) } } end

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