Ручной вызов действия потока в событии, отправленном сервером

Как отправлять уведомления об обновлениях клиентам с помощью события, отправленного сервером?

Что я хочу сделать, так это то, что когда клиент ajax вызывает действие, сервер затем будет отправлять соответствующие данные всем подключающимся клиентам через мое потоковое действие.

Я пытаюсь узнать, возможно ли это без веб-сокетов или pub/subs.


person user1832046    schedule 31.07.2014    source источник
comment
Вы можете использовать функциональность ActionController::Live::SSE Rails.   -  person Richard Peck    schedule 31.07.2014


Ответы (1)


Из того, что я могу понять, вы ищете общий подход, а не конкретный код?

--

SSE

Отправленные сервером события — это технология HTML5. Неважно, используете ли вы Rails или другой фреймворк — они должны просто работать.

Одним из недостатков SSE является то, что они действуют очень похоже на длинный опрос Ajax, что означает, что они отправляют постоянные «пинги» / запросы на ваш сервер, ретранслируя любой ответ, который они находят. И они по-прежнему будут использовать шаблон pub/sub.

-

Проще говоря, SSE — это когда у вас есть Javascript "прослушиватель событий", который будет прослушивать "конечная точка" (URL). Конечная точка, в случае Rails, будет controller#action, из которой вы можете отправлять соответствующие text/event-stream обновления, а это то, что ActionController::Live::SSE нужно сделать

--

Настройка

#config/routes.rb
resources :your_controller do
   collection do
      get :endpoint
   end
end

#app/assets/javascripts/application.js
var source = new EventSource('your_controller/endpoint');
source.addEventListener('message', function(e) {
  console.log(e.data);
}, false);

#app/controllers/your_controller.rb
Class YourController < ActionController::Base
   include ActionController::Live

   def endpoint
      response.headers['Content-Type'] = 'text/event-stream'
      sse = SSE.new(response.stream, retry: 300, event: "event-name")
      sse.write({ name: 'John'})
   ensure
      sse.close
   end
end

Это будет отправлять вам соответствующие обновления каждый раз

person Richard Peck    schedule 31.07.2014