2010-04-03 46 views
5

Tengo un sitio web simple (http://www.kousenit.com/twitterfollowervalue) que calcula una cantidad basada en los seguidores de Twitter de una persona. Dado que la API de Twitter solo devuelve 100 seguidores a la vez, un proceso completo puede implicar muchas llamadas.Mostrar progreso durante una larga llamada Ajax

Por el momento, tengo una llamada de Ajax a un método que ejecuta el ciclo de Twitter. El método se parece (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 
} 

Esta se invoca desde un controlador llamado renderTTFV.groovy. Me llamo el controlador a través de una llamada Ajax usando la biblioteca de prototipo:

En mi página web, en la sección de encabezado (JavaScript):

function displayTTFV() { 
    new Ajax.Updater('ttfv','renderTTFV.groovy', {}); 
} 

y hay un div en el cuerpo de la página que se actualiza cuando la llamada está completa.

Todo funciona, pero el método updateFollowers puede llevar bastante tiempo. ¿Hay alguna forma en que pueda devolver un valor de progreso? Por ejemplo, me gustaría actualizar la página web en cada iteración. Sé de antemano cuántas iteraciones habrá. Simplemente no puedo encontrar una manera de actualizar la página en el medio de ese ciclo.

Cualquier sugerencia sería apreciada.

Respuesta

4

Para el progreso más o menos precisa de informes tiene dos alternativas:

  • mantener el servidor que le dice su progreso
  • mantener al cliente (navegador) que piden al servidor sobre su progreso

Mantener el servidor diciéndole que el progreso sería fácil de implementar. Puede, en lugar de llamar al Ajax.Updater, crear un elemento iframe y modificar el servidor para, para cada iteración, volcar una respuesta con algún javascript que se active para mostrar el progreso en el navegador y eliminar esa respuesta. Así, el navegador ejecutará el javascript y seguirá esperando hasta que finalice la respuesta, de modo que el usuario verá que el indicador de progreso se mueve hacia arriba hasta que todo se complete.

Existen otros enfoques disponibles para que el servidor le informe sobre el progreso de la operación. Puede Bing/Google sobre Comet servidores.

En cuanto a hacer que el navegador pregunte periódicamente sobre el progreso de la operación, puede devolver algún token al navegador para cada iteración que el navegador verifique si es el resultado final o si debe pasarlo a la servidor para que el servidor siga golpeando Twitter para el siguiente conjunto de resultados, o de alguna manera mantenga un estado (si tiene soporte de estado de sesión, eso podría hacerlo) en su servidor que se actualiza en cada iteración y que puede sondearse en una solicitud separada.

Espero que las sugerencias ayuden.

+0

Esta es una aplicación típica para solicitudes HTTP de larga duración, o server-push. Consulte http://en.wikipedia.org/wiki/Comet_%28programming%29 para obtener más detalles. – John

Cuestiones relacionadas