2013-02-21 35 views
2

我使用async_sinatra gem來實現異步路由,但我遇到一個帖子說,Sinatra的流媒體API可以用來代替async_sinatra爲此目的。可以使用流式傳輸實現如下相同的功能嗎?異步請求使用sinatra流媒體API

require 'em-hiredis' 
require 'sinatra/async' 

class App < Sinatra::Base 
    register Sinatra::Async 

    def redis 
    @redis ||= EM::Hiredis.connect 
    end 

    aget '/' do 
    redis.blpop('abcdef', 15). 
     callback {|x| body "x=#{x}"}. 
     errback {|e| body "e=#{e}"} 
    end 

    run! if app_file == $0 
end 

回答

1

回答我的問題:

require 'em-hiredis' 
require 'sinatra/base' 

class App < Sinatra::Base 
    def redis 
    @redis ||= EM::Hiredis.connect 
    end 

    get '/' do 
    stream :keep_open do |out| 
     redis.blpop('abcdef', 15).callback do |x| 
     out << "x=#{x}" 
     out.close 
     end.errback do |e| 
     out << "e=#{e}" 
     out.close 
     end 
    end 
    end 

    run! if app_file == $0 
end