3

我有一個rails 4應用程序,它正在做後臺演算。所以用戶按下一個按鈕後,它會爲長演算(使用delay_job)啓動一個後臺作業併到達一個等待頁面。儘管微積分是異步完成的,但我想找到一種方法來警告用戶,並在微積分完成後自動重新加載頁面。在後臺作業後觸發重新加載頁面

我也考慮過多種解決方案:

  • 王菲或private_pub =>我不能使用另一臺服務器爲這個非常具體的工作
  • 的ActionController ::直播=>我不知道怎麼樣觸發一次作業完成
  • 輪詢=>最好的時刻解決方案的行動,但我希望找到的東西,比輪詢

貪心不足如果您有任何智能搜索解決方案ñ對於這個問題,或任何建議我的限制在列出的想法。

+2

你選擇另一種選擇是輪詢(如您已確定)和WebSockets的(王菲什麼用途)。有一些項目可以將WebSocket服務器注入到您的Rails應用程序中。不過你需要一個多線程服務器(就像Puma)。 – Wukerplank

+0

如果後臺工作不會永久運行,則輪詢聽起來不錯。 – emaillenin

回答

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 

希望這給你

+1

感謝您的回答。關於您的「Live」部分,問題是您需要有一個專用服務器(或Pusher等第三方解決方案)。 –

+0

是的,你是對的! –

相關問題