2010-04-03 91 views
5

我有一個簡單的網站(http://www.kousenit.com/twitterfollowervalue),它根據個人的Twitter追隨者計算數量。由於Twitter API一次只返回關注者100,因此完整的流程可能涉及大量的呼叫。在長時間的Ajax呼叫中顯示進度

目前,我有一個Ajax調用運行Twitter循環的方法。該方法看起來像(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方法可能需要相當長的時間。有什麼方法可以返回進度值?例如,我想在每次迭代中更新網頁。我事先知道會有多少迭代。我只是無法找出一種方法來更新該循環中的頁面。

任何建議,將不勝感激。

回答

4

對於更多或更少精確的進度報告,你有兩個選擇:

  • 保持服務器告訴你它的進展
  • 保持客戶端(瀏覽器)詢問其進展的服務器

讓服務器告訴你進展情況會很容易實現。您可以不調用Ajax.Updater,而是創建iframe元素,並將服務器修改爲(對於每次迭代),轉儲包含一些JavaScript的響應以觸發在瀏覽器上顯示進度並刷新該響應。就像那樣,瀏覽器將執行JavaScript並一直等待,直到響應完成,所以用戶將看到進度指示器向上移動,直到一切完成。

其他方法可用於服務器告訴您有關操作的進度。你可以Bing /谷歌約彗星服務器。對於讓瀏覽器定期詢問操作的進度,您可以爲瀏覽器檢查每次迭代返回一些令牌給瀏覽器,看它是否是最終結果,還是它應該將它傳遞給服務器,以便服務器不斷地爲下一個結果集敲擊twitter,或者以某種方式保持服務器中的狀態(如果您有會話狀態支持,可能會這樣做),每個迭代中更新並​​且可以在單獨的請求上進行輪詢。

我希望這些建議有幫助。

+0

這是長期HTTP請求或服務器推送的典型應用程序。有關更多詳細信息,請參見http://en.wikipedia.org/wiki/Comet_%28programming%29。 – John 2010-04-04 04:02:13