如何阻止EventMachine可延迟对象?

时间:2011-11-22 23:59:20

标签: ruby asynchronous sinatra eventmachine

我正在向另一台服务器发出请求,作为我的Sinatra应用程序的POST方法的一部分。我用来发出请求的库是一个EventMachine库,它在发出请求时立即返回一个EM :: Deferrable对象,但我需要在控制器方法中阻塞,直到异步请求完成,所以我可以返回一个部分请求中返回的数据。这样做的最佳方法是什么?

2 个答案:

答案 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)。

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