mloughran (owner)

Revisions

gist: 215933 Download_button fork
public
Public Clone URL: git://gist.github.com/215933.git
Embed All Files: show embed
better_em_defer?.rb #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
require 'rubygems'
require 'eventmachine'
 
module EventMachine
  # This returns a deferrable and catches errors in the block for you.
  #
  # Define callbacks and errbacks in usual way instead of weird EM.defer way
  def self.better_defer?(&block)
    deferrable = EM::DefaultDeferrable.new
 
    EM.defer do
      begin
        output = block.call
        deferrable.succeed output
      rescue => e
        deferrable.fail e
      end
    end
 
    deferrable
  end
end
 
# Example
 
EM.run {
  deferrable1 = EM.better_defer? do
    sleep 1
    'done'
  end
 
  deferrable2 = EM.better_defer? do
    raise "woops"
  end
 
  deferrable1.callback do |output|
    puts "Deferrable 1 succeeded with #{output}"
  end
 
  deferrable2.errback do |ex|
    puts "Deferrable 2 failed: #{ex.class} #{ex.message}"
  end
}