使用异步sinatra流多个身体

我想从javascript开始一个很长的轮询请求,这很好,我希望我的ruby编程将多个主体部分流式传输到javascript。 为什么以下(伪)代码不起作用?

require 'rubygems' require 'sinatra/async' require 'eventmachine' require 'thin' require 'json' class Test  [ "this is part #{c}" ] }.to_json end end end run! end 

也许我误解了长期轮询和异步应该做什么,但我的期望是我将多个机构送回客户端? 我需要使用eventmachine吗?

谢谢

 require 'rubygems' require 'sinatra/async' require 'thin' require 'json' class Test < Sinatra::Base register Sinatra::Async class JSONStream include EventMachine::Deferrable def stream(object) @block.call object.to_json + "\n" end def each(&block) @block = block end end aget '/process' do puts 'ok' out = JSONStream.new body out EM.next_tick do c = 0 timer = EM.add_periodic_timer(0.3) do c += 1 out.stream :data => ["this is part #{c}"] if c == 100 timer.cancel out.succeed end end end end run! end 

另见: http : //confreaks.net/videos/564-scotlandruby2011-real-time-rack

在下面的示例中,您需要一个EventMachine事件来触发多个实体的发送。 另请参阅此前一个答案 。

 require 'sinatra/async' class AsyncTest < Sinatra::Base register Sinatra::Async aget '/' do body "hello async" end aget '/delay/:n' do |n| EM.add_timer(n.to_i) { body { "delayed for #{n} seconds" } } end end