2014-09-02 66 views

回答

2

我一直在考慮這個我自己!


Push

您需要使用一種叫做推技術(同爲iPhone 「推送通知」)。這將使您能夠將特定更新發送到您的前端。

讓我解釋一下這個問題,以及如何解決它...

你的問題是,在發送持續的更新是不是Rails的的職權範圍內,或HTTP對這一問題。這些都建立在stateless protocol pattern上,這意味着每個請求都在一個乾淨的平臺上。

這意味着,除非你打開一個持續連接(從中可以指定不同的數據屬性),你將只能發送一次更新,通過asynchronous requests


持久

爲了「跟蹤進展」,你需要創建一個系統,該系統首先數據(所以你需要一種方法來收到這些數據),然後您需要能夠處理您將收到的任何推送更新。這就是您將如何創建進度條的「外觀」。

有兩種方法來實現這一目標:

  1. SSE's
  2. Websockets

這些都具有工作的一個非常簡單的方法(你可以在這裏看到:What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?

T嘿基本上可以讓您將前端DOM(通過JS)連接到後端「推送」系統。這將允許您的JS處理從後端發送給您的「監聽」JS調用的任何更新。

我不會詳細討論SSE/Websockets,除了說websockets是最好的解決方案 - 它們是真正的持久性。上證所剛剛使用ajax長線投票至您的controller endpoint,效率低下的&安全性較低。

-

爲了實現 「進度條」 類型的接口,你需要考慮以下模式:

  1. 你的用戶的DOM使用SSE/Websockets連接到您的端點
  2. 使用發佈/訂閱模式,您將擁有每個用戶的頻道
  3. 發送推送通知給各個信道

我會建議使用一個系統,稱爲Pusher這個(沒有從屬關係)。這是一個WebSocket的接口,你的前端連接到系統的後端控制器方法

這將允許您執行以下操作:

#app/assets/stylesheets/application.css.sass 
.progress 
    background: #ccc 
    .bar 
     background: #f0f 

#app/workers/your_job_worker.rb 
class YourJobWorker 
    include Resque::Plugins::Status 

    def perform 
    # send update to pusher here 
    end 

end 

#app/assets/javascripts/application.js 
var pusher = new Pusher('***'); 
var channel = pusher.subscribe('*****'); 
channel.bind('progress', function(data) { 
    $(".bar .progress").css("width", data + "%"); 
}); 

顯然是一個非常粗略的輪廓爲你 - 希望將解釋你如何處理這個問題的方法論。

+2

令人驚歎的是,這似乎是我一直不懈尋找的答案。我會盡力實現這一點,然後將其更新爲正確的答案。謝謝! – earthican 2014-09-03 16:21:03