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 に答える