Module: Delayer::Deferred::Tools
- Included in:
- Delayer::Deferred, Deferred
- Defined in:
- lib/delayer/deferred/tools.rb
Instance Method Summary collapse
-
#fail(value) ⇒ Object
実行中のDeferredを失敗させる。raiseと違って、Exception以外のオブジェクトをtrap()に渡すことができる。 Deferredのnextとtrapの中でだけ呼び出すことができる。 ==== Args [value] trap()に渡す値 ==== Throw :__deferredable_fail をthrowする.
- #next(&proc) ⇒ Object
-
#system(*args) ⇒ Object
Kernel#systemを呼び出して、コマンドが成功たら成功するDeferredを返す。 失敗した場合、trap{}ブロックには $? の値(Process::Status)か、例外が発生した場合それが渡される ==== Args [*args] Kernel#system の引数 ==== Return Deferred.
- #trap(&proc) ⇒ Object
-
#when(*args) ⇒ Object
複数のdeferredを引数に取って、それら全ての実行が終了したら、 その結果を引数の順番通りに格納したArrayを引数に呼ばれるDeferredを返す。 引数のDeferredが一つでも失敗するとこのメソッドの返すDeferredも失敗する。 ==== Args [*args] 終了を待つDeferredオブジェクト ==== Return Deferred.
Instance Method Details
#fail(value) ⇒ Object
実行中のDeferredを失敗させる。raiseと違って、Exception以外のオブジェクトをtrap()に渡すことができる。Deferredのnextとtrapの中でだけ呼び出すことができる。
Args
- value
-
trap()に渡す値
Throw
:__deferredable_fail をthrowする
18 19 |
# File 'lib/delayer/deferred/tools.rb', line 18 def fail(value) throw(:__deferredable_fail, value) end |
#next(&proc) ⇒ Object
6 7 |
# File 'lib/delayer/deferred/tools.rb', line 6 def next(&proc) new.next(&proc) end |
#system(*args) ⇒ Object
Kernel#systemを呼び出して、コマンドが成功たら成功するDeferredを返す。失敗した場合、trap{}ブロックには $? の値(Process::Status)か、例外が発生した場合それが渡される
Args
- *args
-
Kernel#system の引数
Return
Deferred
46 47 48 49 50 51 52 53 54 55 |
# File 'lib/delayer/deferred/tools.rb', line 46 def system(*args) delayer.Deferred.Thread.new { Process.waitpid2(Kernel.spawn(*args)) }.next{|_pid, status| if status && status.success? status else raise ForeignCommandAborted.new("command aborted: #{args.join(' ')}", process: $?) end } end |
#trap(&proc) ⇒ Object
9 10 |
# File 'lib/delayer/deferred/tools.rb', line 9 def trap(&proc) new.trap(&proc) end |
#when(*args) ⇒ Object
複数のdeferredを引数に取って、それら全ての実行が終了したら、その結果を引数の順番通りに格納したArrayを引数に呼ばれるDeferredを返す。引数のDeferredが一つでも失敗するとこのメソッドの返すDeferredも失敗する。
Args
- *args
-
終了を待つDeferredオブジェクト
Return
Deferred
28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/delayer/deferred/tools.rb', line 28 def when(*args) return self.next{[]} if args.empty? defer, *follow = args raise TypeError, "Argument of Deferred.when must be Delayer::Deferred::Deferredable" unless defer.is_a? Delayer::Deferred::Deferredable if follow.empty? defer.next{|res| [res] } else remain = self.when(*follow) defer.next do |res| remain.next do |follow_res| follow_res.unshift(res) end end end end |