2010-04-03 13 views
5

Ho un semplice sito Web (http://www.kousenit.com/twitterfollowervalue) che calcola una quantità in base ai follower di Twitter di una persona. Poiché l'API di Twitter restituisce solo follower 100 alla volta, un processo completo può coinvolgere molte chiamate.Mostra i progressi durante una lunga chiamata Ajax

Al momento, ho una chiamata Ajax a un metodo che esegue il ciclo di Twitter. Il metodo sembra (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 
} 

Questo viene richiamato da un controller chiamato renderTTFV.groovy. Chiamo il controller tramite una chiamata AJAX utilizzando la libreria del prototipo:

sulla mia pagina web, nella sezione di intestazione (JavaScript):

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

e c'è un div nel corpo della pagina che si aggiorna quando la chiamata è completa.

Tutto funziona, ma il metodo updateFollowers può richiedere una notevole quantità di tempo. C'è un modo per restituire un valore di avanzamento? Ad esempio, vorrei aggiornare la pagina Web ad ogni iterazione. So in anticipo quante iterazioni ci saranno. Non riesco a capire un modo per aggiornare la pagina nel mezzo di quel ciclo.

Qualsiasi suggerimento sarebbe apprezzato.

risposta

4

per il progresso più o meno accurata segnalazione si hanno due alternative:

  • mantenere il server che indica l'avanzamento
  • Tenere il client (browser) che chiedono il server circa il suo progresso

Mantenere il server che ti dice i progressi sarebbe di tipo facile da implementare. È possibile, invece di chiamare il Ajax.Updater, creare un elemento iframe e modificare il server per, per ciascuna iterazione, eseguire il dump di una risposta con un javascript per attivare la visualizzazione dell'avanzamento del browser e per svuotare quella risposta. In questo modo, il browser eseguirà il javascript e continuerà ad attendere fino al termine della risposta, quindi l'utente vedrà l'indicatore di avanzamento spostarsi verso l'alto fino al completamento di tutto.

Altri approcci sono disponibili per il server per informarvi sui progressi dell'operazione. È possibile Bing/Google su server Comet.

Come per far sì che il browser richieda periodicamente l'avanzamento dell'operazione, è possibile restituire qualche token al browser per ogni iterazione che il browser controllerà per vedere se è il risultato finale o se deve passarlo al server in modo che il server continui a ricevere twitter per il prossimo set di risultati, o in qualche modo mantenere uno stato (se si dispone del supporto dello stato di sessione, potrebbe farlo) sul server che viene aggiornato in ogni iterazione e che può essere interrogato su una richiesta separata.

Spero che i suggerimenti aiutino.

+0

Questa è una tipica applicazione per richieste HTTP di lunga durata o server-push. Vedi http://en.wikipedia.org/wiki/Comet_%28programming%29 per maggiori dettagli. – John

Problemi correlati