Mam problem z zawijaniem głowy wokół obietnic. Korzystam z interfejsu Google Earth API, aby wykonać "trasę" adresów. Wycieczka to tylko animacja, która trwa około minuty, a po jej zakończeniu kolejna powinna wystartować.AngularJS: łupiąc obietnice ponad dla każdej pętli
Oto moja funkcja, która robi objazd:
var tourAddress = function (address) {
return tourService.getLatLong(address).then(function (coords) {
return tourService.getKmlForCoords(coords).then(function (kml) {
_ge.getTourPlayer().setTour(kml);
_ge.getTourPlayer().play();
var counter = 0;
var d = $q.defer();
var waitForTour = function() {
if (counter < _ge.getTourPlayer().getDuration()) {
++counter;
setTimeout(waitForTour, 1000);
} else {
d.resolve();
}
};
waitForTour();
return d.promise;
});
});
}
Wydaje się to całkiem dobrze działa. Rozpoczyna animację i zwraca obietnicę, która zostanie rozwiązana po zakończeniu animacji. Teraz mam tablicę adresów, i chcę zrobić foreach turystycznej z nich:
$scope.addresses.forEach(function (item) {
tourAddress(item.address).then(function(){
$log.log(item.address + " complete");
});
});
Kiedy to zrobić, wszyscy oni wykonywać w tym samym czasie (Google Earth robi animację na ostatni adres) i wszystkie kończą się w tym samym czasie. Jak połączyć te ogniwa w ogień po zakończeniu poprzedniego?
UPDATE
użyłem @ phtrivier za wielką pomoc, aby go osiągnąć:
$scope.addresses.reduce(function (curr,next) {
return curr.then(function(){
return tourAddress(next.address)
});
}, Promise.resolve()).then(function(){
$log.log('all complete');
});
ahh Dziękuje, myślę, że 'reduce' jest to, czego szukam. Zobaczę, czy mogę to zrobić działa – Jonesopolis
mam to, jeszcze raz dziękuję za poradę – Jonesopolis
Dlaczego '_.reduce'? Równie łatwo można było zrobić 'adresy.reduce' –