2009-08-14 27 views
5

Existe-t-il un moyen d'effacer le texte responseText d'un objet XHR sans détruire l'objet XHR?Comet, responseText et utilisation de la mémoire

Je dois maintenir une connexion permanente ouverte à un serveur Web pour alimenter des données en direct vers un navigateur. Le problème est qu'il y a une quantité de données relativement importante (plusieurs centaines de K par seconde en permanence), donc l'utilisation de la mémoire est un gros problème, car cette connexion doit rester ouverte pendant au moins plusieurs minutes. responseText devient très gros très rapidement, même si le JSON que je renvoie a été réduit aussi petit que possible. En raison de la façon dont fonctionne l'application côté serveur, si j'utilise une scrutation courte de type AJAX et que je détruis juste l'objet XHR lorsque j'en ai fini avec elle, des quantités importantes de données importantes me manquent, même en quelques millisecondes. prend pour analyser la réponse, créer un nouveau XHR et l'envoyer. Je n'ai pas l'option d'utiliser des demandes qui se chevauchent, car le serveur Web n'accepte qu'une seule connexion à la fois. (Ne demandez pas.) Alors Comet est exactement le modèle dont j'ai besoin. Ce que je voudrais faire est d'analyser chaque morceau de JSON quand il revient du serveur, et puis effacez le responseText afin que je puisse continuer à utiliser la même connexion. Cependant, responseText est en lecture seule. Il ne peut pas être directement vidé par une méthode que j'ai trouvée.

Y a-t-il une partie de l'image qui me manque ici? Est-ce que quelqu'un connaît des trucs que je peux utiliser pour libérer responseText quand j'ai fini de le lire? Ou y a-t-il un autre endroit où les réponses du serveur peuvent aller?

Je n'inclue pas le code car c'est vraiment une question presque indépendante du code. Les routines Javascript qui engendrent les XHR et gèrent les données retournées sont très, très simples.

Répondre

1

Voilà comment fonctionne le sondage à long terme. Vous gardez un index dans le dernier numéro de ligne lu et à chaque coche de votre intervalle lu à partir de ce point. C'est une longue connexion, donc une longue réponse. Une nouvelle connexion responseText signifierait une nouvelle connexion. Mais alors ce ne serait plus la comète;)

+0

Merci. Je comprends le modèle. J'espérais juste qu'il y avait un moyen de maintenir la connexion sans être obligé de stocker tout ce qui a déjà été reçu sur cette connexion dans un énorme tampon. Long-polling est un hack de toute façon, donc je suppose que cela demande beaucoup de vouloir que ça fonctionne exactement comme j'ai besoin :) – glomad

+1

@ithcy: il semble en fait une demande raisonnable. Je n'y avais jamais pensé tant que tu m'as demandé. Un 'xhr.flushResponseBuffer()' ou quelque chose pourrait être utile pour des connexions à long terme, et éviterait d'avoir à enregistrer une foutue référence de numéro de ligne tout le temps. –

4

Contrairement à l'autre réponse, "long-polling" n'est pas une connexion longue. "Long-polling" est de nombreuses connexions en séquence, chacune configurée pour rester connectée pendant une période de temps raisonnablement longue si aucune réponse n'est nécessaire. Ils font expirer (typiquement autour de 25-30s), puis rétablissent une nouvelle connexion. Depuis HTTP1.1 permet la réutilisation des connexions existantes, la connexion ne doit pas être renégociée, et peut donc être rétablie pratiquement instantanément.

Alors, utilisez simplement plusieurs requêtes. Comme il y a vraiment un surcoût négligeable pour rétablir la connexion, et chaque nouvelle connexion vous permettra de détruire le texte de réponse précédent, cette solution est parfaitement viable du point de vue performance/overhead, et résoudra également vos problèmes de mémoire.

[Modifier] Je parle par expérience, en tant qu'un des auteurs de WebSync.