2010-04-03 3 views
5

У меня есть простой веб-сайт (http://www.kousenit.com/twitterfollowervalue), который вычисляет количество, основанное на подписчиках Twitter. Поскольку API Twitter только возвращает последователей 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

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

  • Keep сервер говорит вам свой прогресс
  • Держите клиент (браузер) запрашивает сервер о ходе

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

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

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

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

+0

Это типичное приложение для долговечных HTTP-запросов или сервер-push. См. Http://en.wikipedia.org/wiki/Comet_%28programming%29 для более подробной информации. – John