2016-07-29 1 views
1

I Dieses Stück Code in JS hat, wie unten beschriebenJavaScript benimmt weirdly (vielleicht aufgrund ihrer asynchronen Natur)

for (id in ids) { 
    if (id needs to be called) { 
     console.log(id); // statement 1 
     $http.post('someEndpoint', {id : id}).then(function success(response) { 
      console.log(id); // statement 2 
      someDataStructure[id].data = response.data; 
     }); 
    } 
} 

ids = [1, 2, 3] Unter der Annahme, auf Anweisung 1 wird auf der Konsole 1 2 3 gedruckt. Bei Anweisung 2 wird 3 3 3 gedruckt. Dies ist offensichtlich weniger als ideal und ich verliere Daten für . Außerdem muss ich hinzufügen, dass der Endpunkt Anfragen für 1 2 3 bekommt, also bin ich an dieser Stelle wirklich verwirrt. Es wäre toll, wenn jemand etwas Licht werfen könnte und mir helfen würde zu verstehen, wie ich das beheben kann.

+0

Wenn 'ids' ein Array ist,' verwenden für (Lassen Sie den Index in ids) ', und dann 'let id = ids [index]'. – NMSL

+1

Wenn 'ids' ein Array ist, sollten Sie' for-in' nicht verwenden. Ändern Sie es in 'ids.forEach (function (id) {...})' und Sie sind eingestellt. –

+0

@squint Ja, ich kenne dieses Problem, deshalb habe ich gesagt: "Achten Sie darauf, die ID zu nennen, nicht den Index von ID. Um Verwirrung zu vermeiden, habe ich meine Antwort geändert. Mit ES6 lassen Sie uns los – NMSL

Antwort

2

Wrap id in ein closure function:

for (id in ids) { 
    (function(id) { 
     if (id needs to be called) { 
      console.log(id); // statement 1 
      $http.post('someEndpoint', {id : id}).then(function success(response) { 
       console.log(id); // statement 2 
       someDataStructure[id].data = response.data; 
      }); 
     } 
    })(id); 
} 

Sie auch einfach könnte eine forEach Schleife verwenden, die automatisch die Schließung machen:

ids.forEach(function(id) { 
    if (/*id needs to be called*/) { 
     console.log(id); // statement 1 
     $http.post('someEndpoint', {id : id}).then(function success(response) { 
      console.log(id); // statement 2 
      someDataStructure[id].data = response.data; 
     }); 
    } 
}); 
+0

Danke, ich werde es ausprobieren und euch auf dem Laufenden halten :) – pratnala

Verwandte Themen