angularjs - promesas - promise angular 6
Pasando variable para prometer en un bucle (4)
Tengo una promesa en un bucle, y no sé cómo pasar algunas variables de ámbito en el controlador de promesa.
for(var i in superarray){
MyService.get(superarray[i].externalID).then(function(r){
console.debug(i);
});
MyService es un servicio que funciona, con un método get que devuelve una promesa.
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;
}
});
En mi consola, console.debug no muestra lógicamente 1,2,3,4,5. Pero 5,5,5,5,5. (hay 5 elementos en mi superarray)
¿Cómo puedo pasar el valor ''i'' en el alcance de mi promesa, así que puedo usarlo en el then ()?
¿Es posible?
Para cuando se ejecute la devolución de llamada, i
referiré al último elemento de tu matriz. Puede usar un cierre y capturar el valor actual de i
:
for (var i in superarray){
(function(j) {
MyService.get(superarray[j].externalID).then(function(r) {
console.debug(j);
});
})(i);
}
Una forma es capturar i
en un cierre:
for(var i in superarray) {
(function(i) {
MyService.get(superarray[i].externalID).then(function(r) {
console.debug(i);
});
})(i);
}
Otra forma sería organizar que itemID
se repita como propiedad de r
:
for(var i in superarray){
MyService.get(superarray[i].externalID).then(function(r) {
console.debug(r.itemID);
});
};
Puede simplificar un poco el código usando Array.prototype.forEach
incorporado:
superarray.forEach(function (item, index) {
MyService.get(item.externalID).then(function(r) {
console.debug(index);
});
});
Acabo de comentar sobre la solución aceptada, pero actualmente no tengo suficiente reputación.
Creo que la segunda solución de repetir ítem ID como una propiedad de r también funcionaría bien.
manejador de promesa simple:
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 devuelve itemID como una propiedad del objeto devuelto:
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;
}
}});
Aquí hay un ejemplo de trabajo en plnkr .