无论用户在哪个页面上,服务器发送的事件始终会被触发吗?

问题描述 投票:0回答:1

我对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来说是新手,如果这从根本上是错误的,也请提供建议。谢谢!

ruby-on-rails server-sent-events
1个回答
0
投票

[在您处理SSE的控制器中,您应该循环进行更新,然后一旦客户端消失,ActionController::Live::ClientDisconnected将由response.stream.write引发:

© www.soinside.com 2019 - 2024. All rights reserved.