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

时间:2014-03-06 09:04:58

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

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

我看了几个解决方案:

  • Faye或private_pub =>我无法承担使用另一台服务器来完成这项非常具体的工作
  • ActionController :: Live =>我不确定如何在作业完成后触发操作
  • 轮询=>目前最好的解决方案,但我希望找到比投票更少贪心的东西

如果您对此问题有任何明智的解决方案,或者对列出的提示中的限制提出任何建议。

1 个答案:

答案 0 :(得分:1)

我会解释这对你有用吗<​​/ p>


<强> HTTP

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

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

我们之前使用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

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