2012-12-18 55 views
0

我使用了一個API,寫在EM之上。這意味着撥打電話,我需要寫下如下內容:如何從Sinatra應用程序中使用EventMachine?

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上運行。

我在做什麼錯?

+0

本帖](http://stackoverflow.com/a/3007083/1177119)可能是對你有所幫助。 –

+0

看到此信息: http://stackoverflow.com/questions/2999430/any-success-with-sinatra-working-together-with-eventmachine-websockets – Poul

回答

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 
+0

存在用於在西納特拉異步請求處理庫。例如https://github.com/raggi/async_sinatra。這裏是我的相關主題的帖子:http://stackoverflow.com/questions/14993386/async-requests-using-sinatra-streaming-api – akonsu

相關問題