0

我使用的是写在 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|
      output = "Result: #{result}"
    end
    EventMachine.stop
  end
  output
end

但这不起作用。该run块被绕过,因此返回一个空响应,一旦stop被调用,Sinatra 就会关闭。

不确定它是否相关,但我的 Sinatra 应用程序在 Thin 上运行。

我究竟做错了什么?

4

1 回答 1

0

通过忙于等待数据可用,我找到了一种解决方法。可能不是最好的解决方案,但它至少有效:

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
于 2012-12-20T13:57:58.613 回答