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