Futureパターン

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