lib/em-http/multi.rb in em-http-request-0.2.10 vs lib/em-http/multi.rb in em-http-request-0.2.11
- old
+ new
@@ -1,51 +1,55 @@
module EventMachine
- # EventMachine based Multi request client, based on a streaming HTTPRequest class,
+ # EventMachine based Multi request client, based on a streaming HTTPRequest class,
# which allows you to open multiple parallel connections and return only when all
# of them finish. (i.e. ideal for parallelizing workloads)
- #
+ #
# == Example
- #
+ #
# EventMachine.run {
- #
+ #
# multi = EventMachine::MultiRequest.new
- #
+ #
# # add multiple requests to the multi-handler
# multi.add(EventMachine::HttpRequest.new('http://www.google.com/').get)
# multi.add(EventMachine::HttpRequest.new('http://www.yahoo.com/').get)
- #
+ #
# multi.callback {
# p multi.responses[:succeeded]
# p multi.responses[:failed]
- #
+ #
# EventMachine.stop
# }
# }
- #
-
+ #
+
class MultiRequest
include EventMachine::Deferrable
attr_reader :requests, :responses
-
- def initialize
- @requests = []
+
+ def initialize(conns=[], &block)
+ @requests = []
@responses = {:succeeded => [], :failed => []}
+
+ conns.each {|conn| add(conn)}
+ callback(&block) if block_given?
end
-
+
def add(conn)
@requests.push(conn)
conn.callback { @responses[:succeeded].push(conn); check_progress }
conn.errback { @responses[:failed].push(conn); check_progress }
end
-
+
protected
-
+
# invoke callback if all requests have completed
def check_progress
- succeed if (@responses[:succeeded].size + @responses[:failed].size) == @requests.size
+ succeed(self) if (@responses[:succeeded].size +
+ @responses[:failed].size) == @requests.size
end
-
+
end
end