在后台作业后触发页面的重新加载

Rap*_* Pr 5 asynchronous ruby-on-rails delayed-job faye ruby-on-rails-4

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

我查看了几种解决方案:

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

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

Ric*_*eck 1

我将向您解释这如何运作


HTTP协议

当您将请求发送到 Rails 时,除了直接响应之外,您的浏览器没有任何方式“侦听”发生的情况。HTTP请求已“发送”并且没有任何机制来等待异步过程完成

您的工作是为您的应用程序提供一个“侦听器”,以便您的前端可以在生成更新时接收更新(超出 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
Run Code Online (Sandbox Code Playgroud)

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