【问题标题】:Show progress during a long Ajax call在长时间的 Ajax 调用期间显示进度
【发布时间】:2010-04-03 22:09:20
【问题描述】:

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

任何建议将不胜感激。

【问题讨论】:

    标签: javascript ajax groovy progress-bar prototypejs


    【解决方案1】:

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

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

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

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

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

    希望这些建议对你有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多