2010-07-19 5 views
0

J'ai remarqué que parfois ma requête Mootools ajax est envoyée deux fois. La deuxième requête réussit tout de suite, mais la première continue à attendre indéfiniment. Je ne sais pas si c'est un bug dans Mootools ou quelque chose que j'ai fait.dupliquer des requêtes ajax au hasard

Cela a été vérifié avec firebug dans firefox et la console développeur en chrome. Je n'ai pas pu le vérifier dans IE, mais les symptômes sont les mêmes.

J'ai réussi à prendre une capture d'écran de Firebug montrant le problème: http://janipeltoniemi.net/ajax.png

Sur la droite, vous voyez le script de boucle de demande je l'ai écrit à des fins de test. Il fait juste une demande avec un nouvel identifiant une fois la requête précédente terminée, donc rien de fantaisie là-bas. Les 2 dernières lignes dans la console montrent le problème que j'ai. Comme vous pouvez le voir, ils ont tous les deux la même réponse et le même identifiant. Le hachage md5 est généré en utilisant md5(microtime(1)), il devrait donc être différent si ces 2 requêtes étaient réellement différentes avec le même identifiant.

La boucle s'arrête à ce point car elle ne déclenche pas l'événement onSuccess lorsque le dernier est terminé. Je suppose que cela se déclencherait quand l'autre requête serait terminée, mais cela ne s'est pas encore produit.

Des idées ce qui se passe ici?

Presque oublié, j'utilise Mootools 1.2.4

Le code dans l'image:

r = new Request.HTML(); 
counter = 0; 
//increments the counter and requests hello.php 
go = function() { 
    counter += 1; 
    //The loop was too fast and producted some side effects when delay was not used 
    r.get.delay(10, r, [ 'templates/hello.php', { counter: counter } ]) 
} 
//Create an endless loop. When the request from go() is finished, call go() 
r.addEvent('success', go); 
//Start the endless loop 
go(); 
+0

Vous devez publier votre code. –

+0

cela ne montre pas quel événement pilote la requête ajax elle-même. –

+0

Je ne suis pas sûr de comprendre. Le problème n'est en aucune façon spécifique au code ci-dessus. C'est juste un moyen rapide de reproduire le problème et c'est tout le code nécessaire (mis à part Mootools 1.2.4). Je pense que le problème ici est de faire passer le message correctement en raison de mon mauvais anglais, alors laissez-moi essayer encore une fois: Le code est supposé fonctionner tel quel dans firebug. Il commence une boucle sans fin avec une autre demande étant faite lorsque le précédent est terminé. À un moment donné, une requête est dupliquée (vérifiez l'image) et 'onSuccess' n'est pas déclenché, donc la boucle s'arrête. Voir les commentaires dans le code pour plus d'informations. – jpeltoniemi

Répondre

0

cela semble avec le recyclage de l'ancienne instance de la classe de demande avant qu'il ne soit « prêt » Ainsi, l'ancienne requête déclenche l'onSuccess sans que le serveur ne ferme la connexion où le client perd son intérêt et la redémarre, laissant Firebug en attente.

http://www.jsfiddle.net/dimitar/NF2jz/201/

var r = new Request.HTML({ 
    url: '/ajax_html_echo/', 
    data: {'html': "hello"}, 
    method: 'post', 
    update: 'target_div', 
    onSuccess: function(response) { 
     (function() { 
      go(); // you can reproduce the bug by removing the delay wrap 
     }).delay(1000); 
    } 
}); 

var counter = 0; 

var go = function() { 
    counter++; 
    // despite of trying r.cancel(), it does not cancel, 
    // you can set onCancel to test this; 
    r.cancel().setOptions({ 
     data: {html: "attempt " + counter} 
    }).send(); 

}; 

go(); 

strictement parlant, si vous exécutez hors d'une fonction anonyme, vous n'avez pas besoin d'être recycler l'ancienne instance - ou même l'enregistrer.

ce que je voudrais faire est quelque chose comme ça (mais probablement refondus afin qu'il puisse être annulé):

var counter = 0; 
(function go() { 
    counter++; 
    // fresh instance after success/complete: 
    new Request.HTML({ 
     url: '/ajax_html_echo/', 
     data: {'html': "hello " + counter}, 
     method: 'post', 
     update: 'target_div', 
     onSuccess: function(response) { 
      go(); 
     } 
    }).send(); 
})(); 

http://www.jsfiddle.net/dimitar/NF2jz/202/ demoing dernier code, fonctionne très bien et d'une manière qui complète et ne pas interférer les uns avec les autres .

+0

Il semble que j'ai omis de mentionner que dans le cas d'origine l'instance de demande n'est pas recyclée, désolé à ce sujet. En outre, ce n'est pas seulement un cas unique. J'ai remarqué ce comportement étrange ici et là depuis un moment maintenant, mais seulement récemment j'ai commencé à le voir comme un problème. – jpeltoniemi

+0

bien - avec le risque de paraître ennuyé - pour référence future, postez votre code/url exact ou créez un cas de test qui reproduit avec succès votre problème pour que tout le monde puisse le voir. Sinon, vous perdez tout le temps. bonne chance, il n'y a pas de problème avec la classe Request que je connais. Recherchez les événements en double liés qui déclencheront l'ajax. –

+0

Oui, je sais. Je devrais probablement avoir posté le code original, mais c'est vraiment pas différent du cas de test (en dehors de réutiliser l'instance de demande) si vous le dépouillez aux os nus. Le code posté a été utilisé par moi pour rapidement reproduire le problème (parfois prend plus de 1000 requêtes avant d'apparaître) et comme il semblait reproduire le problème avec succès, je n'ai pas réfléchi davantage. – jpeltoniemi