2010-04-10 5 views
2

Je suis en train de faire des appels à long sondage ajax, dos à dos. Le problème avec la façon dont je le fais actuellement est que je fais chaque appel successif à partir de la fonction de rappel de l'appel précédent. Est-ce un problème? Firebug ne montre aucun de mes appels ajax comme étant terminé, même si les données sont retournées et que le rappel est exécuté. La structure récursive semble inefficace. Des idées?Ajax long sondage dos-à-dos sans une fonction de rappel récursive

window.addEvent('domready', function() 
{ 
    server = new Request({ 
    url: "chat.php", 
     method: 'get', 
     link: 'ignore', 
     onSuccess: callback, 
    }); 

    request = server.send(); 
} 

function callback(data) 
{ 
    console.log(data); 
    var data = JSON.decode(data); 
    messId = data.max; 
    for(var i = 0; i < data.messages.length; i++) 
    { 
     print("", data.messages[i].text); 
    } 
    var sendString = "messId="+messId; 
    request = server.send(sendString); 
} 
+0

Un code d'urs peut être utile pour obtenir des réponses pour vous ... –

+0

si votre implémentation ajax utilise iframe pour gérer la requête, alors vous devriez aller au panneau 'net' pour voir les requêtes, elles ne seront pas montré dans le panneau de la console – Dapeng

Répondre

1

Vous avez raison, vous devez maintenir une pile et fermetures sans but quand vous faites sondages longue de cette façon et en fonction de la situation et la mise en œuvre que vous pourriez obtenir un débordement de pile ou au moins courir bas sur mémoire ... bien que je ne sache pas avec certitude quelles sont les optimisations que les différentes implémentations de js effectuent (par exemple, la récursivité de la queue qui ferait disparaître ces problèmes).

L'alternative facile est d'utiliser window.setTimeout(funcName) qui appellera immédiatement la fonction funcName lorsque l'étendue actuelle résout, à partir de la portée globale.

+0

donc j'ai remplacé: request = server.send (sendString); avec: window.setTimeout ("recieve()"); et les fonctions ne sont toujours pas terminées. – Teddy

+0

Attendez, puisque c'est une demande asynchrone, la fonction de rappel devrait finir, non? – Teddy

+0

Oui, ils devraient finir. À moins que les demandes soient expirées ... au lieu de finir? Vous pouvez au moins essayer de changer votre dernière ligne à ce 'window.setTimeout (fonction() {server.send (sendString)});' Bien que je ne pense pas que les appels sont récursifs, les requêtes HTTP du navigateur sont asynchrones comme vous l'avez dit. –