2010-11-15 11 views
3

J'ai un code qui appelle $ .ajax comme ceci:jquery ajax avec faux bloque async Firefox

$.ajax({ 

         type: "POST", 
         url: "/sandbox/graphloader/mock3", 
         async: false, 
         data: {calInput1:dates[0], calInput2:dates[1]}, 
         success: function(data){ 
          data=eval(data); 
          for(var x in data[0]){ 
           //alert(data[0][x]); 
           //fill columns here; 
          } 

          fillPercents(column); 
         }}); 

maintenant, cela fonctionne dans tous les navigateurs autres que Firefox. firebug montre qu'il reçoit une réponse de post, mais pour une erreur inconnue, il n'affiche pas les données. Quel pourrait être le problème?

+0

Quel est le problème? – SLaks

+0

Le problème est que firefox ne finit jamais le chargement. J'utilise un ui jquery pour montrer les colonnes qui sont peuplées avec des données retournées par ajax, les données ne sont jamais remplies. – Shrinath

+0

Que se passe-t-il si vous mettez un appel 'console.log' ou' alert' au début du rappel? Voyez-vous des erreurs dans Firebug? – SLaks

Répondre

10

Ce problème est inhérent à conception.

Jamais utilisez async: false.
Étant donné que Javascript s'exécute sur le thread de l'interface utilisateur, une requête async: false gèlera le navigateur jusqu'à ce que le serveur réponde.

+0

"jusqu'à ce que le serveur répond" est ok. Laisser geler. mais une fois que le serveur répond, il devrait être normal non? – Shrinath

+1

** Non, NE LE laissez PAS geler **. C'est le moyen le plus sûr (OK, presque sûr) d'éloigner les utilisateurs de votre site. – SLaks

+0

Je vois ... ok, alors j'ai un nouveau problème. Mes appels ajax sont censés remplir 4 colonnes avec des données du serveur après qu'un utilisateur change la date sur la colonne. puis il y a des calculs sur ces nouvelles données. J'ai aussi mis les calculs dans la fonction "succès" de l'appel ajax de jquery. mais les calculs se passent sur les anciennes données "parfois". Puis-je éviter cela? – Shrinath

0

Votre columns global peut être écrasé par une requête AJAX précédente. Essayez d'en faire une variable locale dans le rappel et essayez d'ajouter des appels console.log pour vous assurer que l'ordre de rappel correspond à ce que vous attendiez.


Vous devrez peut-être conserver un compteur de requêtes global pour vous assurer de ne pas traiter une réponse après l'envoi d'une nouvelle requête.

Par exemple:

var lastRequest = 0; //You may want to put this in a namespace or closure 

... 

var thisRequest = ++lastRequest; 
$.ajax({ 
    type: "POST", 
    url: "/sandbox/graphloader/mock3", 
    async: false, 
    data: {calInput1:dates[0], calInput2:dates[1]}, 
    success: function(data){ 
     if (thisRequest !== lastRequest) return; 
     ... 
    }}); 

Ne le faites pas dans un corps de boucle ou vous partagerez la variable thisRequest. À la place, appelez une fonction du corps de la boucle.

1

Il est en train de geler, car il n'obtient pas de réponse de "succès" et vous n'avez pas traité l'erreur. Définissez un error: function(jqXHR, textStatus, errorThrown){} dans vos paramètres pour gérer la réponse d'erreur. async: false fonctionne très bien.