2010-07-14 6 views
4

J'extraire un fichier XML en utilisant ce code:Paramètre supplémentaire pour la fonction ajax succès jQuery

function getMaps(){ 

    toLoad = loadMaps.length; 

    for (var i = 0; i < loadMaps.length; i++){ 
     $.ajax({ 
      type: "GET", 
      url: loadMaps[i], 
      dataType: "xml", 
      success: processMap 
     }); 
    } 
} 

Ce qui fonctionne très bien, mais je veux donner processMap un autre paramètre (à savoir loadMaps [i], le nom sous qui pour stocker le xml chargé)

Je ne peux pas comprendre comment faire ceci sans avoir recours à des variables globales, ce qui n'est pas ce que je veux.

+0

La meilleure solution serait d'utiliser effectivement POO, au lieu de l'indice passant dans un tableau autour. :) – WhyNotHugo

Répondre

4

Le jQuery success callback a trois paramètres qui ne peuvent être modifiés ou élargis. Vous devez donc appeler votre fonction dans une fonction anonyme qui se referme.

for (var i = 0; i < loadMaps.length; i++){ 
    $.ajax({ 
     type: "GET", 
     url: loadMaps[i], 
     dataType: "xml", 
     success: function(xhr, textStatus, error){ 
      processMap(loadMaps[i]); 
     } 
    }); 
} 
+3

Soyez prudent avec cela. "i" devrait toujours être loadMaps.length + 1. Assurez-vous d'enrouler votre code ajax sur une fonction avec un paramètre pour la variable "i" – ggomeze

1
function getMaps(){ 
    toLoad = loadMaps.length; 

    for (var i = 0; i < loadMaps.length; i++){ 
     $.ajax({ 
      type: "GET", 
      url: loadMaps[i], 
      dataType: "xml", 
      success: function() { 
       // do anything 
       processMap(x,y,z,'foo'); 
      } 
     }); 
    } 
} 
+0

N'oubliez pas d'accepter le paramètre venant de l'appel ajax: 'succès: fonction (données) {' – peirix

1

Le problème de la question acceptée que « i » sera toujours la dernière valeur dans la boucle, au moins l'événement Le succès arrive plus vite que la prochaine itération d'une boucle, ce qui est arrive presque jamais.

Voici comment cela a fonctionné dans mon cas:

function getMaps(){ 

    toLoad = loadMaps.length; 

    for (var i = 0; i < loadMaps.length; i++){ 
     $.ajax({ 
      type: "GET", 
      url: loadMaps[i], 
      dataType: "xml", 
      success: (function(loadMap){ 
       return function processMap(response){ 
       // code of processMap function ... 
       alert(loadMap); 
       } 
      })(loadMaps[i]) 
     }); 
    } 
} 

Voici la réponse originale de la question similaire: how to pass multiple arguments to onSuccess function in Prototype?

Questions connexes