2011-11-30 50 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。