【问题标题】:Trigger the reloading of a page after a background job在后台作业后触发页面重新加载
【发布时间】:2014-04-08 19:16:17
【问题描述】:

我有一个 rails 4 应用程序,它正在做背景微积分。因此,用户按下一个按钮,它会启动一个长演算的后台作业(使用 delay_job)并到达等待页面。尽管微积分是异步完成的,但我想找到一种方法来警告用户并在微积分完成后自动重新加载页面。

我查看了几种解决方案:

  • Faye 或 private_pub => 我不能为这项非常具体的工作使用另一台服务器
  • ActionController::Live => 我不知道作业完成后如何触发操作
  • 轮询 => 目前最好的解决方案,但我希望找到比轮询更不贪婪的方法

如果您对此问题有任何聪明的解决方案,或者对我在列出的想法中的限制有任何建议。

【问题讨论】:

  • 您的选项是轮询(如您所确定的)和 websockets(Faye 使用的)。有一些项目可以将 websocket 服务器注入到您的 Rails 应用程序中。不过,您将需要一个多线程服务器(如 Puma)。
  • 如果后台作业不会永远运行,轮询听起来不错。

标签: ruby-on-rails asynchronous ruby-on-rails-4 delayed-job faye


【解决方案1】:

我会解释这对你有什么作用


HTTP

当您向 Rails 发送请求时,除了直接响应之外,您的浏览器无法“监听”任何事情发生的情况。 HTTP request 已“发送”,没有任何机制等待异步进程完成

您的工作是为您的应用程序提供一个“监听器”,以便您的前端可以在生成更新时接收更新(超出 HTTP 范围),因此 websocketSSE 的东西

我们之前使用 Pusher 设置了您要查找的内容


“直播”

实现“实时”功能是您所需要的

这基本上意味着保持对服务器“永久”开放的请求;监听服务器发回的任何“事件”。这是通过前端的 JS 完成的,客户端将“订阅”一个频道(通常是一个以用户为中心的频道),然后将所有数据发送给它

我们最近使用了一个名为Pusher 的第三方系统来实现这一点:

#GemFile
gem "pusher", "~> 0.12.0"    

#app/controllers/message.rb
def send_message
    public_key = self.user.public_key
    Pusher['private-user-' + public_key].trigger('message_sent', {
        message: "Message Sent"
    })  
end

   #app/assets/javascripts/application.js
   pusher = new Pusher("***********",
     cluster: 'eu'
   )

   channel = pusher.subscribe("private-user-#{gon.user}")
   channel.bind "message_sent", (data) ->
    alert data.message

希望这为您提供另一种选择

【讨论】:

  • 感谢您的回答。关于您的“直播”部分,问题是您需要有一个专用服务器(或像 Pusher 这样的第三方解决方案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2016-04-27
  • 2011-12-02
  • 1970-01-01
  • 2023-03-11
  • 2017-07-07
  • 2011-07-07
相关资源
最近更新 更多