I have a promise in a loop, and I don't know how to pass some scope variables into the promise handler.
for(var i in superarray){ MyService.get(superarray[i].externalID).then(function(r){ console.debug(i); });
MyService is a working service, with a get method that return a promise.
app.factory('MyService', function($http,$q) { return { get : function(itemID){ var deferred = $q.defer(); $http.get('/someresturl/'+itemID).then(function(e) { deferred.resolve(e.data); }, function(reason) { deferred.reject(reason); }); return deferred.promise; } });
In my console, the console.debug logicaly doesn't display 1,2,3,4,5. But 5,5,5,5,5. (there are 5 elements in my superarray).
How can I pass 'i' value in my promise scope, so I can use it in the then() ?
Is it possible?
One way is to capture i
in a closure :
for(var i in superarray) { (function(i) { MyService.get(superarray[i].externalID).then(function(r) { console.debug(i); }); })(i); }
Another way would be to arrange for itemID
to be repeated back as a property of r
:
for(var i in superarray){ MyService.get(superarray[i].externalID).then(function(r) { console.debug(r.itemID); }); };
By the time your callback is run, i
will refer to the last element in your array. You can use a closure and capture the current value of i
:
for (var i in superarray){ (function(j) { MyService.get(superarray[j].externalID).then(function(r) { console.debug(j); }); })(i); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With