2009-08-14 9 views
5

C'è un modo per cancellare il testo di risposta di un oggetto XHR senza distruggere l'oggetto XHR?Comet, responseText e utilizzo della memoria

È necessario mantenere aperta una connessione permanente a un server Web per inviare dati in tempo reale a un browser. Il problema è che c'è una quantità relativamente grande di dati in arrivo (diverse centinaia di K al secondo costantemente), quindi l'utilizzo della memoria è un grosso problema, perché questa connessione deve rimanere aperta per almeno alcuni minuti. responseText diventa molto grande molto rapidamente, anche se il JSON che invio è stato ridotto al minimo.

A causa del modo in cui funziona l'applicazione sul lato server, se utilizzo il polling breve in stile AJAX e distruggo l'oggetto XHR quando ho finito, mi manca una quantità significativa di dati importanti anche nei pochi millisecondi. per analizzare la risposta, creare un nuovo XHR e inviarlo. Non ho la possibilità di utilizzare richieste sovrapposte, poiché il server Web accetta solo una connessione alla volta. (Non chiedere.) Quindi Comet è esattamente il modello che mi serve.

Quello che mi piacerebbe fare è analizzare ogni blocco JSON mentre ritorna dal server, e quindi cancellare responseText in modo che possa continuare ad usare la stessa connessione. Tuttavia, responseText è di sola lettura. Non può essere svuotato direttamente da alcun metodo che ho trovato.

C'è una parte dell'immagine che mi manca qui? Qualcuno sa trucchi che posso usare per liberare responseText quando ho finito di leggerlo? O c'è un altro posto dove possono andare le risposte del server?

Non ho incluso il codice perché questa è una domanda praticamente non codificante per il codice. Le routine Javascript che generano gli XHR e gestiscono i dati restituiti sono molto, molto semplici.

risposta

1

Ecco come funziona il polling a lungo. Si mantiene un indice nell'ultimo numero di riga letto e con ciascun segno del proprio intervallo letto da quel punto in poi. È una lunga connessione, quindi una lunga risposta.

Un nuovo responseText significherebbe una nuova connessione. Ma allora non sarebbe più cometa;)

+0

Grazie. Capisco la modella. Speravo solo che ci fosse un modo per mantenere la connessione senza essere costretti a memorizzare tutto ciò che è stato mai ricevuto su quella connessione in un buffer enorme. Il polling lungo è un hack in ogni caso, quindi suppongo che stia chiedendo molto a desiderare che funzioni esattamente nel modo in cui mi serve :) – glomad

+1

@ithcy: in realtà sembra una richiesta ragionevole. Non ci avevo mai pensato molto prima che me lo chiedessi. Un 'xhr.flushResponseBuffer()' o qualcosa potrebbe essere utile per le connessioni a lunga esecuzione, e farebbe risparmiare il salvataggio di un dannato numero di linea di riferimento tutto il tempo. –

4

Contrariamente all'altro risposta, "polling lungo" non è una connessione lunga. "Lungo polling" sono molte connessioni in sequenza, ciascuna configurata per rimanere connessa per un periodo di tempo ragionevolmente lungo se non è necessaria alcuna risposta. Sono do timeout (in genere circa 25-30 secondi) e quindi viene ristabilita una nuova connessione. Poiché HTTP1.1 consente il riutilizzo di connessioni esistenti, la connessione non deve essere rinegoziata e può quindi essere ristabilita virtualmente all'istante.

Quindi, utilizzare solo più richieste. Dal momento che c'è davvero un sovraccarico trascurabile per ristabilire la connessione, e ogni nuova connessione ti permetterà di distruggere il precedente testo di risposta, questa è una soluzione perfettamente valida da una prospettiva di performance/overhead e risolverebbe anche i tuoi problemi di memoria.

[Modifica] Sto parlando per esperienza, come uno degli autori di WebSync.