Как я могу заблокировать отложенный объект EventMachine? - PullRequest
0 голосов
/ 23 ноября 2011

Я делаю запрос к другому серверу как часть метода POST для моего приложения Sinatra.Библиотека, которую я использую для создания запроса, является библиотекой EventMachine, которая немедленно возвращает объект EM :: Deferrable при выполнении запроса, но мне нужно заблокировать в методе контроллера до завершения асинхронного запроса, чтобы я мог вернуть частичное сданные возвращаются в запросе.Какой лучший подход для этого?

Ответы [ 2 ]

1 голос
/ 23 ноября 2011

Одним из решений будет использование 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 голосов
/ 23 ноября 2011

Когда вы блокируете на четном API, вы получаете худший из двух миров.

Я бы попытался избежать вызовов через EM в пользу более «традиционных» методов (а-ля curl).*

Если это невозможно, то я бы вернул пустую частичку и попросил клиента опросить сервер на наличие обновлений.

...