Ho problemi a ricordare le promesse. Sto utilizzando l'API di Google Earth per fare un "tour" di indirizzi. Un tour è solo un'animazione che dura circa un minuto, e quando si completa, il prossimo dovrebbe iniziare.AngularJS: concatenamento di promesse per ogni ciclo
Ecco la mia funzione che fa un giro:
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;
});
});
}
Questo sembra funzionare abbastanza bene. Avvia l'animazione e restituisce una promessa che si risolve al termine dell'animazione. Ora ho un array di indirizzi, e voglio fare un tour foreach di loro:
$scope.addresses.forEach(function (item) {
tourAddress(item.address).then(function(){
$log.log(item.address + " complete");
});
});
Quando faccio questo, tutti eseguono allo stesso tempo (Google Earth fa l'animazione per l'ultimo indirizzo) e completano tutti allo stesso tempo. Come faccio a incatenarli per farli sparire dopo aver completato quello precedente?
UPDATE
ho usato grande aiuto @ di phtrivier per realizzarla:
$scope.addresses.reduce(function (curr,next) {
return curr.then(function(){
return tourAddress(next.address)
});
}, Promise.resolve()).then(function(){
$log.log('all complete');
});
ahh grazie, penso 'reduce' è quello che sto cercando. Vedrò se riesco a farlo funzionare – Jonesopolis
capito, grazie ancora per la guida – Jonesopolis
Perché il '_.reduce'? Si potrebbe tranquillamente fare 'address.reduce' –