2013-06-21 11 views
33

Mam obietnicę w pętli i nie wiem, jak przekazać niektóre zmienne zasięgu do obsługi obietnicy.Przekazywanie zmiennej do obietnicy w pętli

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

MyService to działająca usługa, z metodą get, która zwraca obietnicę.

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; 
    } 
}); 

W mojej konsoli, logiczna konsola console.debug nie wyświetla 1,2,3,4,5. Ale 5,5,5,5,5. (w moim superarrayu jest 5 elementów).

Jak mogę przekazać wartość "i" w moim zakresie obietnicy, więc mogę go używać w tym()?

Czy to możliwe?

+6

Ktoś powinien ci powiedzieć, że twoja funkcja "get" jest niepotrzebnie skomplikowana. Można go zastąpić przez: get: function (itemID) {return $ http.get ('/ someresturl /' + itemID); } –

Odpowiedz

69

Jednym ze sposobów jest, aby uchwycić i w zamknięciu:

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

Innym sposobem byłoby zorganizować itemID być powtarzane z powrotem jako właściwością r:

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

Dowolny link, w którym mogę uzyskać składnię (function (i) {}) (i); szczegółowe ? – Ant

+0

W jednej chwili sprawdzę, czy mogę coś znaleźć ... –

+4

@Cooluhuru: Po prostu tworzysz anonimową funkcję (bit 'function (i) {}') i nazywasz ją 'i' jako pierwszy argument. Kończysz śledzenie 'i' z zewnętrznego zakresu, więc sortujesz przekazując' i' przez wartość, a nie przez odniesienie. – Blender

15

Do czasu uruchomienia wywołania zwrotnego, i będzie odnosić się do ostatniego elementu w twojej tablicy. Można użyć zamknięcie i przechwytywać bieżącą wartość i:

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

można uprościć kod trochę za pomocą wbudowanego Array.prototype.forEach:

+1

Działa również za pomocą kąta.do każdego –

3

Chciałbym tylko skomentować zaakceptowane rozwiązanie, ale obecnie nie mam wystarczającej reputacji.

Sądzę, że drugie rozwiązanie polegające na powtórzeniu itemID z powrotem jako własności r również będzie działało dobrze.

proste obsługi obietnica:

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 powrocie ItemID jako własność zwróconego obiektu:

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; 
    } 
}}); 

Oto przykład roboczych on plnkr.

Powiązane problemy