Ruby 如何在Sinatra应用程序中使用EventMachine?
我使用了一个写在EM之上的api。这意味着要进行调用,我需要编写如下内容:Ruby 如何在Sinatra应用程序中使用EventMachine?,ruby,sinatra,eventmachine,Ruby,Sinatra,Eventmachine,我使用了一个写在EM之上的api。这意味着要进行调用,我需要编写如下内容: EventMachine.run do api.query do |result| # Do stuff with result end EventMachine.stop end 很好 但现在我想在Sinatra控制器中使用相同的API。我试过这个: get "/foo" do output = "" EventMachine.run do api.query do |result
EventMachine.run do
api.query do |result|
# Do stuff with result
end
EventMachine.stop
end
很好
但现在我想在Sinatra控制器中使用相同的API。我试过这个:
get "/foo" do
output = ""
EventMachine.run do
api.query do |result|
output = "Result: #{result}"
end
EventMachine.stop
end
output
end
但这不起作用。run
块被绕过,因此返回一个空响应,一旦调用了stop
,Sinatra就会关闭
不确定是否相关,但我的Sinatra应用程序运行在瘦版上
我做错了什么?我找到了一个解决办法,忙着等待数据可用。可能不是最好的解决方案,但至少可以:
helpers do
def wait_for(&block)
while (return_val = block.call).nil?
sleep(0.1)
end
return_val
end
end
get "/foo" do
output = nil
EventMachine.run do
api.query do |result|
output = "Result: #{result}"
end
end
wait_for { output }
end
可能会对您有所帮助。请参阅本文:Sinatra中有用于异步请求处理的库。例如以下是我关于一个相关主题的帖子: