我对SSE来说还很陌生,所以如果我误解了目的,可以随时告诉我,并且有一种更好的方法来实现我想要的!
我有一个有效的SSE,它每分钟都会更新用户的仪表板。代码看起来像这样:
# SitesController
def dashboard
end
def regular_update
response.headers['Content-Type'] = 'text/event-stream'
sse = SSE.new(response.stream, event: 'notice')
begin
sse.write(NoticeTask.perform) # custom code returning the JSOn
sleep 60
rescue ClientDisconnected
ensure
sse.close
end
end
# routes
get "/dashboard(/:id)" => "sites#dashboard"
get "/site_update" => 'sites#regular_update'
# view - /dashboard
var source = new EventSource('/site_update');
source.addEventListener('notice', function(event) {
var data = JSON.parse(event.data)
appendNoticeAndAlert(data)
});
这很好。当我为某个用户使用/dashboard
时,SSE会定期更新正确的信息,太好了!
但是,我注意到我是否位于任意随机页面上,就像主页一样,SSE仍在后台运行。现在...显然这是有道理的,因为代码中没有任何东西限制了...但不应该存在???好像不应该以某种方式对SSE进行范围划分吗?如果用户从不使用/dashboard
来使SSE在后台持续工作,从而更新/dashboard
页面,是否会浪费大量资源?
同样,对于SSE来说是新手,如果这从根本上是错误的,也请提供建议。谢谢!
[在您处理SSE的控制器中,您应该循环进行更新,然后一旦客户端消失,ActionController::Live::ClientDisconnected
将由response.stream.write
引发: