Javascript, $ .ajax, nom de variable

J'essaie d'itérer sur un tableau et d'affecter une variable avec une boucle for. Donc, quelque chose comme ça:

function Person(name, status){ this.name = name; this.status = status; } var status = []; var array = ["bill","bob","carl","ton"]; function exAjax(function(){ for(var i = 0; i < array.length; i++){ var name = array[i]; console.log(name); =====> this gives the correct name $.ajax({ url: xxxxxxx, success: function(data){ if(data.stream === null){ var person = new Person(name, "dead"); console.log(name); =====> return undefined until the last person status.push(person); } } }) name = ""; } }) 

Le problème que j'en ai est que ce nom n'entre pas dans la fonction de réussite. Je pensais que js continue de voyager vers le haut pour rechercher la variable si elle n'existe pas dans sa portée actuelle Je ne suis pas défini pour la variable de nom si j'essaie de créer le nom de console.log. La portée maîtrise ce que je fais mal?

Vous pouvez utiliser .queue() , $.map() pour maintenir la portée du name . De plus, modifiez le tableau d' status à un objet ayant un status propriété où la valeur est un tableau afin d'éviter tout conflit avec this.status of Person object.

Notez que vous pouvez également chaîner .promise(/* queueName */) pour effectuer des tâches à .then() lorsque toutes les fonctions en attente dans queueName , ieg, "status" ont été appelées, queueName .length est 0 .

 function Person(name, status){ this.name = name; this.status = status; } var blob = new Blob(['{"stream":null}'], {type:"application/json"}); var url = URL.createObjectURL(blob); // change `status` array reference, eg, to `arr` var arr = {status:[]}; var array = ["bill","bob","carl","ton"]; $(arr).queue("status", $.map(array, function(curr) { return function(next) { var name = curr; // do asynchronous stuff $.ajax({url:url, dataType:"json"}) .then(function(data) { if(data.stream == null){ var person = new Person(name, "dead"); console.log(name, person); arr.status.push(person); } }) .then(next) // call next function in `"status"` queue } })) .dequeue("status") .promise("status") // do stuff when all functions in `"status"` queue have completed, // `"status"` queue `.length` is `0` .then(function() { // `this` : `arr` as jQuery object // `this[0].status`: array containing objects pushed to `arr.status` console.log(this[0].status); // $(this).prop("status"); }); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"> </script> 

C'est parce que $.ajax effectue une requête HTTP (Ajax) asynchrone. Cela signifie que votre boucle for attend pas que la success terminée. Au lieu de cela, il continuera avec son itération.

Une façon (des nombreuses solutions possibles) est de rendre cette $.ajax synchronous avec l'option async: false

De la documentation

Async (par défaut: true)
Type: Boolean
Par défaut, toutes les requêtes sont envoyées de manière asynchrone (c'est-à-dire que cette valeur est définie par défaut par défaut). Si vous avez besoin de requêtes synchrones, définissez cette option sur false.

  for(var i = 0; i < array.length; i++){ var name = array[i]; console.log(name); =====> this gives the correct name $.ajax({ url: xxxxxxx, async: false, success: function(data){ if(data.stream === null){ var person = new Person(name, "dead"); console.log(name); =====> return undefined until the last person status.push(person); } } }) name = ""; } })