在服务器发送的事件中手动调用流操作

时间:2014-07-31 11:12:56

标签: ruby-on-rails server-sent-events

如何使用服务器发送的事件向客户端发送更新通知?

我想要完成的是当客户端ajax调用一个动作时,服务器然后通过我的流动作将相关数据发送到所有连接的客户端。

我试图知道如果没有websockets或pub / subs,这是否可行。

1 个答案:

答案 0 :(得分:1)

从我可以收集的内容来看,您正在寻找一种通用的方法,而不是特定的代码?

-

<强> SSE的

Server Sent Events是一种HTML5技术,这意味着如果你正确地执行它,无论你是使用Rails还是其他框架都应该无关紧要 - 它们应该正常工作

SSE的一个缺点是它们与Ajax长轮询非常相似,这意味着它们会向您的服务器发送持续的“ping”/请求,并将其发现的任何响应转发回来。他们仍然会使用pub/sub模式

-

简单地说,SSE就是你有一个Javascript "event listener",它会收听"endpoint"(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

每次都会为您发送相关更新