在长时间的Ajax调用期间显示进度

时间:2010-04-03 22:09:21

标签: javascript ajax groovy progress-bar prototypejs

我有一个简单的网站(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方法可能需要相当长的时间。有什么方法可以返回进度值吗?例如,我想在每次迭代时更新网页。我提前知道会有多少次迭代。我只是无法找到在该循环中间更新页面的方法。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:4)

对于或多或少准确的进度报告,您有两种选择:

  • 让服务器告诉您其进度
  • 让客户端(浏览器)向服务器询问其进度

让服务器告诉您进度将很容易实现。您可以,而不是调用Ajax.Updater,而不是调用iframe元素,并修改服务器,为每次迭代,转储带有一些javascript的响应,以触发显示浏览器的进度,并刷新响应。像这样,浏览器将执行javascript并一直等待响应完成,因此用户将看到进度指示器向上移动直到完成所有操作。

服务器可以使用其他方法来告诉您操作的进度。您可以Bing / Google了解 Comet服务器

至于让浏览器定期询问操作的进度,你可以向浏览器返回一些令牌,浏览器会检查它是否是最终结果,或者是否应该将其传递给服务器所以服务器一直在为下一个结果集敲击twitter,或以某种方式保持服务器中的状态(如果你有会话状态支持,可能会这样做),在每次迭代中更新并​​且可以在单独的请求中轮询。 / p>

我希望这些建议有所帮助。