EventMachineでFuture(Promise)パターンするときの例文をメモ
GitHub - cotag/em-promise: A promise/deferred implementation for EventMachine
require 'em-promise'
def testMethod
deferred = EM::Q.defer
EM.defer do
begin
# databaseなどを非同期処理
raise "exception" if [true, false].sample # テストなのでわざと例外発生
deferred.resolve('true') # 成功した時はresolveを実行、引数を渡せる
rescue => e
deferred.reject(e) # 例外のときはrejectを実行、引数を渡せる
end
end
deferred.promise # promiseを返す
end
EventMachine.run do
testMethod.then(proc{|m|
puts "succeed #{m}" # 成功した時の処理、viewになげたり
}, proc{|m|
puts "failed #{m}" # 失敗した時の処理
}).then(proc{|m|
puts "finished" # finalize
EM.stop
})
puts "async"
end
非同期実行なのでasyncが表示されてからtestMethodが、実行されます。 testMethodの中身を、もうすこしすっきり書きたいので、書き直し。
require 'em-promise'
def future
deferred = EM::Q.defer
EM.defer do
yield(deferred)
end
deferred.promise
end
def testMethod
future do |dfr|
begin
# databaseなどを非同期処理
raise "exception" if [true, false].sample # テストなのでわざと例外発生
dfr.resolve('true') # 成功した時はresolveを実行、引数を渡せる
rescue => e
dfr.reject(e) # 例外のときはrejectを実行
end
end
end
EventMachine.run do
testMethod.then(proc{|m|
puts "succeed #{m}" # 成功した時の処理、viewになげたり
}, proc{|m|
puts "failed #{m}" # 失敗した時の処理
}).then(proc{|m|
puts "finished" # finalize
EM.stop
})
puts "async"
end