2014-09-04 15 views
5

Mam więc metodę na serwerze angularjs, który wywołuje metodę, która zwraca obietnicę dla każdej metody w tablicy. Używam podkreślenia _each do przechodzenia przez tablicę. Chcę poczekać, aż cała tablica jest przetwarzana zanim zadzwonię końcową linię kodu w metodzie ..

Więc ...

function ProcessCoolStuff(coolStuffs) 
{ 
var stuff = []; 
_.each(coolStuffs, function(coolStuff) 
{ 
    //Some method using $q to return 
    makeStuffCooler(coolStuff).then(function(coolerStuff) 
    { 
    stuff.push(coolerStuff); 
    }); 
}); 
//Maybe Call a Display Method, or call event ect.. 
ShowAllMyCoolStuff(stuff); 
} 

To oczywiście nie działa .. pętla kończy i wywołuje 'ShowAllMyCoolStuff', zanim zrobi się makeStuffCooler dla każdego elementu. Więc .. jaki jest właściwy sposób interakcji z metodą asynchroniczną, więc moja metoda ShowAllMyCoolStuff będzie czekać, aż kolekcja zostanie wypełniona? Może to być mój brak doświadczenia z $ q i obietnice w ogóle, ale utknąłem. Z góry dziękuję.

+0

Warto zauważyć, że jeśli Twoja przeglądarka działa kanciasty, prawdopodobnie można na nim polegać i mieć Array.prototype.forEach Array.prototype.map.But tak, $ q.all gdzie to jest w. – pfooti

Odpowiedz

8

Chcesz użyć $q.all, która ma szereg obietnic. Więc użyj zamiast each i przekaż wynik do $q.all(), co daje obietnicę, która czeka na wszystkie z nich. Nie potrzebujesz nawet tej tablicy stuff, która jest ręcznie wypełniana, ale po prostu może użyć wartości rozdzielczości tej nowej obietnicy.

function processCoolStuff(coolStuffs) { 
    return $q.all(_.map(coolStuffs, makeStuffCooler)); 
} 
processCoolStuff(…).then(showAllMyCoolStuff); 
+2

Fajnie, dzięki. Dokładnie tego potrzebowałem. Pomyślałem, że ma to coś wspólnego z $ q.all .. Również +1 przy pozbyciu się ręcznie wypełnionej tablicy. –

0
$q.all([promise1,promise2,promise3,etc]) 
.then(function(results){ 
    alert("This alert will happen after all promises are resolved."); 
}) 
0

po przeczytaniu pytania i odpowiedniej odpowiedzi, dotarłem na właściwą drogę. Dzięki, do tej pory! Ale dla ostatecznego rozwiązania pracy spędziłem jeszcze godzinę, aby wszystkie przypadki użycia działały. Właśnie dlatego chciałbym udostępnić przykład kodu, który zawiera przykuty obietnicami, w tym szereg obietnic oczekiwania na rozwiązanie.

Użyj tła sprawy to import pliku po stronie serwera (nodeJs) po przesłaniu. Użyłem obietnic, aby zwrócić odpowiedni status i wynik HTTP.

readFile: function (fileName) { 
    if (fileName) { 
     var deferred = Q.defer(); 
     var self = this; 
     converter({input: fileName}, function (error, userData) { 
      if (error) { 
       deferred.reject(error); 
      } 
      self.storeUsers(error, userData) 
       .then(function (success) { 
        if (success) { 
         deferred.resolve(success) 
        } 
       }) 
       .fail(function (error) {      
        deferred.reject(error)      
       }); 
     }); 
     return deferred.promise; 
    } 
}, 

storeUsers: function (error, data) { 
    return Q.all(_.map(data, function (users, emailAddress) { 
     var deferred = Q.defer(); 
     userRepository.findUserByEmail(emailAddress, function (user) { 
      //... 
      user.save(function (error) { 
       if (error) { 
        deferred.reject(error); 
       } else { 
        deferred.resolve(emailAddress); 
       } 
      }); 

     }); 
     return deferred.promise; 
    })); 
} 

Nadzieję, że też pomaga!

Cheers Ben