我正在向另一台服务器发出请求,作为我的Sinatra应用程序的POST方法的一部分。我用来发出请求的库是一个EventMachine库,它在发出请求时立即返回一个EM :: Deferrable对象,但我需要在控制器方法中阻塞,直到异步请求完成,所以我可以返回一个部分请求中返回的数据。这样做的最佳方法是什么?
答案 0 :(得分: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
答案 1 :(得分:0)
当你阻止一个公平的API时,你会遇到两个世界中最糟糕的一个。
我会尽量避免通过EM调用更多“传统”方法(a-la curl)。
如果这是不可能的,那么我将返回一个空的部分并让客户端轮询服务器以进行更新。