2011-11-30 68 views
2

“未捕获抛出:异步”我试图设置我的环境有两个轨道,EventMachine和async_sinatra一起玩,我想我有东西安装错误,因为我得到一个错误“未捕获抛出:异步“。当使用async_sinatra与Rails EventMachine和瘦

这是我的就是我在我的Gemfile:

source 'http://rubygems.org' 

gem 'rails', '3.1.3' 
gem 'sinatra' 
gem 'async_sinatra' 
gem 'execjs' 
gem 'therubyracer' 
gem 'eventmachine' 
gem 'rack-fiber_pool', :require => 'rack/fiber_pool' 
gem 'thin' 

这是config.ru:

require ::File.expand_path('../config/environment', __FILE__) 
use Rack::FiberPool 
run Longpoll::Application 

这是我在我的routes.rb文件:

match '/longpoll', :to => LongPoll 

这是我的long_poll.rb文件:

class LongPoll < Sinatra::Base 
    register Sinatra::Async 

    aget '/longpoll' do 
    body 'Hello world!' 
    end 
end 

任何想法我缺少这个设置的工作?

编辑:

我想通了,没有架子,fiber_pool工作解决的事情。 任何人都可以确认他们是否可以一起工作吗?

又如赋予相同的错误basic.ru:

#!/usr/bin/env rackup -Ilib:../lib -s thin 
require 'sinatra/async' 
require 'rack/fiber_pool' 

class AsyncTest < Sinatra::Base 
    register Sinatra::Async 
    use Rack::FiberPool 

    enable :show_exceptions 

    aget '/' do 
    body "hello async" 
    end 
end 

run AsyncTest.new 

回答

2

如果使用webrick时,切换到thin解决它已经看到这种错误。 因此我不能直接确认你的假设,但我猜想使用webrick以及rack-fiber_pool可能会中断。

#!/usr/bin/env ruby 
# 
require "rubygems" 
require "sinatra/async" 

class AsyncTest < Sinatra::Base 
    set :server, :thin 

    register Sinatra::Async 

    aget '/' do 
    body "hello async" 
    end 

    run! if app_file == $0 
end 

上面的代码适合我。

0

IMO它们是互斥的。

rack-fiber-pool负责使用光纤的结果调用async.callback。它还负责做一个throw :async来告诉瘦,以保持连接打开。 async_sinatra也照顾完全相同的事情。当您致电body {}时,它会呼叫async.callback。还有一个throw :async认为它必须告诉瘦,保持连接打开。这是你所看到的问题。 async_sinatra正在抛出:异步和机架光纤池正在捕捉它,并认为这是一个实际的错误。

你可以看一下async_sinatra这里投掷:https://github.com/raggi/async_sinatra/blob/master/lib/sinatra/async.rb#L69

和机架纤维池醒目位置:https://github.com/mperham/rack-fiber_pool/blob/master/lib/rack/fiber_pool.rb#L24

您还可以,如果你想两全其美退房sinatra_synchrony。