Покажите прогресс во время длинного вызова Ajax

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

В данный момент у меня есть вызов 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', {});
}

и существует отделение в теле страницы, которая обновляет, когда вызов завершен.

Все работает, но updateFollowers метод может занять изрядное количество времени. Есть ли некоторый способ, которым я мог возвратить значение прогресса? Например, я хотел бы обновить веб-страницу на каждом повторении. Я знаю заранее, сколькими там будут повторения. Я просто не могу выяснить способ обновить страницу посреди того цикла.

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

5
задан kousen 3 April 2010 в 22:11
поделиться

1 ответ

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

  • Сообщать серверу о ходе выполнения
  • Сохранять клиент ( browser), спрашивающий сервер о его прогрессе

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

Сервер может сообщить вам о ходе операции и другими способами. Вы можете Bing / Google о серверах Comet .

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

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

4
ответ дан 15 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: