2011-11-22 43 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)。

如果这是不可能的,那么我会返回一个空的部分,并让客户端轮询服务器的更新。