Показать прогресс во время длинного Ajax-звонка - PullRequest
5 голосов
/ 04 апреля 2010

У меня есть простой веб-сайт (http://www.kousenit.com/twitterfollowervalue), который вычисляет количество на основе подписчиков в Твиттере человека. Поскольку API Twitter возвращает только 100 подписчиков за раз, полный процесс может включать много вызовов.

В данный момент у меня есть 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 может занять достаточно много времени. Есть ли способ вернуть значение прогресса? Например, я хотел бы обновлять веб-страницу на каждой итерации. Я заранее знаю, сколько будет итераций. Я просто не могу найти способ обновить страницу в середине этого цикла.

Любые предложения будут оценены.

1 Ответ

4 голосов
/ 04 апреля 2010

Для более или менее точной отчетности о прогрессе у вас есть два варианта:

  • Держите сервер, сообщая вам о своем прогрессе
  • Держите клиента (браузера), спрашивающего сервер о его продвижении

Отслеживание прогресса на сервере будет довольно простым. Вместо вызова Ajax.Updater вы можете создать элемент iframe и изменить сервер таким образом, чтобы для каждой итерации выводить ответ с использованием некоторого JavaScript, чтобы вызвать отображение прогресса в браузере и сбросить этот ответ. Таким образом, браузер выполнит javascript и будет ждать окончания ответа, поэтому пользователь увидит, что индикатор прогресса движется вверх, пока все не будет завершено.

Для сервера доступны другие подходы, чтобы сообщить вам о ходе операции. Вы можете Bing / Google о Comet серверах .

Что касается того, чтобы браузер периодически запрашивал ход выполнения операции, вы можете либо возвращать некоторый токен браузеру для каждой итерации, которую браузер будет проверять, чтобы увидеть, является ли это конечным результатом, или он должен передать его на сервер. поэтому сервер продолжает нажимать на твиттер для следующего результирующего набора или каким-либо образом сохранять состояние (если у вас есть поддержка состояния сеанса, которое может это сделать) на вашем сервере, которое обновляется на каждой итерации и которое можно опрашивать по отдельному запросу.

Я надеюсь, что предложения помогут.

...