2010-08-17 3 views
0

J'ai ce petit script jquery qui ne fonctionne pas si je supprime la partie 'async: false' ... Et je ne comprends pas pourquoi (la partie alert() est là juste pour vérifier si ça marche ou pas). Je suppose que cela fonctionnerait de manière asynchrone, mais ce n'est pas le cas. Quelqu'un peut-il m'expliquer pourquoi? Et que dois-je changer pour le rendre asynchrone?Script jQuery supposé fonctionner en mode asynchrone mais fonctionne uniquement en synchronisation? Pourquoi?

$(document).ready(function(){ 
    var artistName = new Array(); 
    var artistPlaycount = new Array(); 

    $('#inputForm').submit(function(){ 
     var userName = $('#username').attr('value'); 
     var amount = $('#amount').attr('value'); 

     userName = "someUsername"; 

     $.ajax({ 
      type: "POST", 
      url: "prepXML.php", 
      data: "method=getartists&user="+userName+"&amount="+amount, 
      dataType: "xml", 
      async:false, 
      success: function(xml){ 
       var i = 0; 
       $("artist",xml).each(function(){ 
        artistName[i] = $(this).find("name").text(); 
        artistPlaycount[i] = $(this).find("playcount").text(); 
        i++; 
       }); 
      } 
     });   
    }); 

    alert(artistName[2]); //or any other iteration number 
}); 

merci

+0

Supprimer "async: false" pour le rendre asynchrone. Votre question n'est toujours pas claire. – Chris

Répondre

3

Pour ce faire, de manière asynchrone, vous devez déplacer l'alerte dans le rappel et supprimer l'option async, comme ceci:

$.ajax({ 
     type: "POST", 
     url: "prepXML.php", 
     data: "method=getartists&user="+userName+"&amount="+amount, 
     dataType: "xml", 
     success: function(xml){ 
      $("artist",xml).each(function(i){ 
       artistName[i] = $(this).find("name").text(); 
       artistPlaycount[i] = $(this).find("playcount").text(); 
      }); 
      alert(artistName[2]); 
     } 
    }); 

Sinon cette fonction success peuplant le tableau se produit après l'alerte fait ... alors ce que vous voulez n'est pas encore là. Ce n'est que lorsque la requête revient du serveur que le gestionnaire success s'exécute.

En outre, le premier paramètre à la fonction de rappel .each() est l'index, vous pouvez l'utiliser, pas besoin de garder votre propre variable :) incrémenter

0

Il ne fonctionne pas parce que le rappel est déclenché après alert. Mettez le alert dans le rappel.

0

vous devez déplacer l'alerte dans votre gestionnaire de succès.

alert(artistName[2]); //or any other iteration number 

devrait aller juste après que vous bouclez le xml.

donc vous devriez avoir:

success: function(xml){ 
      var i = 0; 
      $("artist",xml).each(function(){ 
       artistName[i] = $(this).find("name").text(); 
       artistPlaycount[i] = $(this).find("playcount").text(); 
       i++; 
      }); 
      alert(artistName[2]); //or any other iteration number 
     } 
Questions connexes