lib/eventmachine/sync-defer.rb in sync-defer-0.9.1 vs lib/eventmachine/sync-defer.rb in sync-defer-0.9.2

- old
+ new

@@ -10,25 +10,48 @@ if funcs.size == 1 defer_one(fiber, funcs.first) else defer_multi(fiber, funcs) end - Fiber.yield + result, exception = Fiber.yield + if exception + raise exception + else + result + end end def defer_one fiber, func - EventMachine.defer(lambda{ func.call }, - lambda{ |result| fiber.resume(result)}) + exception = nil + EventMachine.defer(lambda{ + begin + func.call + rescue Exception => e + exception = e + end + }, + lambda{ |result| fiber.resume(result, exception)}) end def defer_multi fiber, funcs - results = {} + results, exception = {}, nil funcs.each.with_index do |func, index| EventMachine.defer( - lambda{ func.call }, + lambda{ + begin + func.call + rescue Exception => e + exception = e + end + }, lambda{ |result| - results[index] = result - fiber.resume(results.sort.map(&:last)) if results.size == funcs.size + if exception + fiber.resume(nil, exception) + else + results[index] = result + fiber.resume(results.sort.map(&:last), nil) if + results.size == funcs.size + end }) end end end