我公司開發的RoR的應用,做在使用resque-status背景的一些文件處理。Ruby on Rails的4 resque狀態進度條
我希望能夠顯示後臺作業百分比狀態的CSS進度條。
有沒有辦法從視圖中獲取作業的狀態(實時),以便我可以更改進度條的值?
我公司開發的RoR的應用,做在使用resque-status背景的一些文件處理。Ruby on Rails的4 resque狀態進度條
我希望能夠顯示後臺作業百分比狀態的CSS進度條。
有沒有辦法從視圖中獲取作業的狀態(實時),以便我可以更改進度條的值?
我一直在考慮這個我自己!
您需要使用一種叫做推技術(同爲iPhone 「推送通知」)。這將使您能夠將特定更新發送到您的前端。
讓我解釋一下這個問題,以及如何解決它...
你的問題是,在發送持續的更新是不是Rails的的職權範圍內,或HTTP對這一問題。這些都建立在stateless protocol pattern上,這意味着每個請求都在一個乾淨的平臺上。
這意味着,除非你打開一個持續連接(從中可以指定不同的數據屬性),你將只能發送一次更新,通過asynchronous requests
持久
爲了「跟蹤進展」,你需要創建一個系統,該系統首先推數據(所以你需要一種方法來收到這些數據),然後您需要能夠處理您將收到的任何推送更新。這就是您將如何創建進度條的「外觀」。
有兩種方法來實現這一目標:
這些都具有工作的一個非常簡單的方法(你可以在這裏看到:What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet? )
T嘿基本上可以讓您將前端DOM(通過JS)連接到後端「推送」系統。這將允許您的JS處理從後端發送給您的「監聽」JS調用的任何更新。
我不會詳細討論SSE/Websockets,除了說websockets是最好的解決方案 - 它們是真正的持久性。上證所剛剛使用ajax長線投票至您的controller endpoint,效率低下的&安全性較低。
-
推
爲了實現 「進度條」 類型的接口,你需要考慮以下模式:
- 你的用戶的DOM使用SSE/Websockets連接到您的端點
- 使用發佈/訂閱模式,您將擁有每個用戶的頻道
發- 發送推送通知給各個信道
我會建議使用一個系統,稱爲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 + "%");
});
顯然是一個非常粗略的輪廓爲你 - 希望將解釋你如何處理這個問題的方法論。
令人驚歎的是,這似乎是我一直不懈尋找的答案。我會盡力實現這一點,然後將其更新爲正確的答案。謝謝! – earthican 2014-09-03 16:21:03