2013-06-21 8 views
33

Ich habe eine Zusage in einer Schleife, und ich weiß nicht, wie einige Gültigkeitsbereichsvariablen in den Promise-Handler übergeben werden.Übergabe der Variable, um in einer Schleife zu versprechen

for(var i in superarray){ 
    MyService.get(superarray[i].externalID).then(function(r){ 
     console.debug(i); 
}); 

MyService ist ein funktionierender Dienst, mit einer Get-Methode, die ein Versprechen zurückgibt.

In meiner Konsole zeigt der console.debug logischerweise nicht 1,2,3,4,5. Aber 5,5,5,5,5. (Es gibt 5 Elemente in meinem Superarray).

Wie kann ich 'ich' Wert in meinem Versprechen Bereich weitergeben, damit ich es in der dann() verwenden kann?

Ist es möglich?

+6

Jemand sollte Sie darauf hinweisen, dass Ihre "Get" -Funktion unnötig kompliziert ist. Es könnte ersetzt werden mit: get: function (itemID) {return $ http.get ('/ someresturl /' + itemID); } –

Antwort

69

Eine Möglichkeit ist i in einem Verschluss zu erfassen:

for(var i in superarray) { 
    (function(i) { 
     MyService.get(superarray[i].externalID).then(function(r) { 
      console.debug(i); 
     }); 
    })(i); 
} 

Eine weitere Möglichkeit für itemID anzuordnen wäre wie zu wiederholen zurück eine Eigenschaft von r:

for(var i in superarray){ 
    MyService.get(superarray[i].externalID).then(function(r) { 
     console.debug(r.itemID); 
    }); 
}; 
+0

Jeder Link, wo ich die Syntax von (Funktion (i) {}) (i) bekommen kann; detailliert? – Ant

+0

Einen Moment, ich werde sehen, ob ich etwas finden kann .... –

+4

@Cooluhuru: Du machst nur eine anonyme Funktion (das 'function (i) {}' bit) und rufe es mit 'i' als erstes Argument. Am Ende schirmst du das "i" vom äußeren Bereich ab, also übergibst du "i" nach Wert, nicht nach Referenz. – Blender

15

Wenn der Callback ausgeführt wird, verweist i auf das letzte Element in Ihrem Array. Sie können einen Verschluss verwenden und den aktuellen Wert von i erfassen:

for (var i in superarray){ 
    (function(j) { 
     MyService.get(superarray[j].externalID).then(function(r) { 
      console.debug(j); 
     }); 
    })(i); 
} 
5

Sie können den Code ein wenig vereinfachenmithilfe der integrierten in:

+1

Funktioniert auch mit angular.forEach –

3

Ich hätte auf die akzeptierte Lösung nur kommentiert, aber ich derzeit nicht genug Ruf.

Ich denke, dass die zweite Lösung der Wiederholung der itemID zurück als eine Eigenschaft von r würde genauso gut funktionieren.

einfache Versprechen Handler:

angular.module('myApp', []).run(['MyService', function(MyService) { 
    superarray = [1, 2, 3, 4, 5]; 


    for(var i in superarray) { 
    MyService.get(superarray[i]).then(function(returned) { 
     console.log(returned.id); 
    }); 
    } 

}]); 

MyService itemID als Eigenschaft des zurückgegebenen Objekts Rückkehr:

angular.module('myApp') 
.factory('MyService', function($http,$q) { 
    return { 
    get : function(itemID){ 
     var deferred = $q.defer(); 

     $http.get('www.google.com').then(function(e) { 
       var returnObject = { 
        'data': e.data, 
        'id': itemID 
       }; 
       deferred.resolve(returnObject); 
     }, function(reason) { 
       deferred.resolve(reason); 
     }); 
     return deferred.promise; 
    } 
}}); 

Hier ist ein funktionierendes Beispiel on plnkr.