[英]Show progress during a long Ajax call
我有一個簡單的網站( http://www.kousenit.com/twitterfollowervalue ),根據一個人的Twitter粉絲計算數量。 由於Twitter API一次僅返回關注者100,因此完整的過程可能涉及大量呼叫。
目前,我對運行Twitter循環的方法進行了Ajax調用。 該方法看起來像(Groovy):
def updateFollowers() {
def slurper = new XmlSlurper()
followers = []
def next = -1
while (next) {
def url = "http://api.twitter.com/1/statuses/followers.xml?id=$id&cursor=$next"
def response = slurper.parse(url)
response.users.user.each { u ->
followers << new TwitterUser(... process data ...)
}
next = response.next_cursor.toBigInteger()
}
return followers
}
這是從一個名為renderTTFV.groovy的控制器調用的。 我使用原型庫通過Ajax調用來調用控制器:
在我的網頁上,在標題部分(JavaScript)中:
function displayTTFV() {
new Ajax.Updater('ttfv','renderTTFV.groovy', {});
}
並且在呼叫完成時,頁面正文中有一個div更新。
一切正常,但updateFollowers方法可能需要相當長的時間。 有什么方法可以返回進度值嗎? 例如,我想在每次迭代時更新網頁。 我提前知道會有多少次迭代。 我只是無法弄清楚在該循環中間更新頁面的方法。
任何建議,將不勝感激。
對於或多或少准確的進度報告,您有兩種選擇:
保持服務器告訴您進度將很容易實現。 您可以,而不是調用Ajax.Updater
,創建一個iframe
元素並修改服務器,為每次迭代,轉儲帶有一些javascript的響應,以觸發顯示瀏覽器的進度,並刷新該響應。 像這樣,瀏覽器將執行javascript並一直等待響應完成,因此用戶將看到進度指示器向上移動直到完成所有操作。
服務器可以使用其他方法來告訴您操作的進度。 你可以Bing / Google關於Comet服務器 。
至於讓瀏覽器定期詢問操作的進度,你可以在瀏覽器每次迭代時返回一些令牌,瀏覽器會檢查它是否是最終結果,或者是否應該將它傳遞給服務器以便服務器繼續按下twitter來獲取下一個結果集,或以某種方式保持服務器中的狀態(如果你有會話狀態支持,可能會這樣做),在每次迭代中更新並且可以在單獨的請求中輪詢。
我希望這些建議有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.