我正在尝试设置我的环境,让两个rails,EventMachine和async_sinatra一起玩,我想我有一些设置错误因为我收到错误“uncaught throw:async”。
这是我在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
任何想法我都缺少这个设置吗?
修改
我发现没有rack-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
答案 0 :(得分: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
上面的代码对我来说很好。
答案 1 :(得分:0)
IMO他们互相排斥。
rack-fiber-pool负责使用光纤的结果调用async.callback
。它还负责执行throw :async
告诉瘦以保持连接打开。 async_sinatra也会处理完全相同的事情。当您致电async.callback
时,它会致电body {}
。并且throw :async
认为它必须告诉瘦以保持连接打开。这是你看到的问题。 async_sinatra抛出:async和rack-fiber-pool正在抓住它并认为这是一个实际的错误。
你可以在这里看看async_sinatra:https://github.com/raggi/async_sinatra/blob/master/lib/sinatra/async.rb#L69
和rack-fiber-pool赶上这里:https://github.com/mperham/rack-fiber_pool/blob/master/lib/rack/fiber_pool.rb#L24
如果你想要两者兼顾,你也可以查看sinatra_synchrony。