2011-11-22 65 views
0

我向另一臺服務器發出請求,作爲我的Sinatra應用程序的POST方法的一部分。我用來發出請求的庫是一個EventMachine庫,當發出請求時立即返回一個EM :: Deferrable對象,但是我需要在控制器方法中阻塞,直到異步請求完成,這樣我才能返回一個partial數據在請求中返回。這樣做的最佳方法是什麼?如何阻止EventMachine可延遲對象?

+0

您是否正在使用像瘦的EM網絡服務器? – tbuehlmann

回答

1

一個解決方案是使用async_sinatra和基於EM的網絡服務器,如Thin。使用async_sinatra,您將有一個body方法進行顯式呈現。它會這樣工作:

require 'sinatra/async' 
require 'em-http-request' 

class Application < Sinatra::Base 
    register Sinatra::Async 

    apost '/' do 
    http = EM::HttpRequest.new('http://www.google.de/').get 

    http.callback do 
     body do 
     # your http processing in here, will be rendered 
     end 
    end 

    http.errback do 
     body { 'error' } 
    end 
    end 
end 
+0

這工作完美。謝謝! – Bryan

0

當你封堵一個API時,你會遇到兩個世界中最糟糕的情況。

我會盡量避免通過EM調用,以支持更多'傳統'方法(a-la curl)。

如果這是不可能的,那麼我會返回一個空的部分,並讓客戶端輪詢服務器的更新。