如何使用服务器发送的事件向客户端发送更新通知?
我想要完成的是当客户端ajax调用一个动作时,服务器然后通过我的流动作将相关数据发送到所有连接的客户端。
我试图知道如果没有websockets或pub / subs,这是否可行。
答案 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
每次都会为您发送相关更新