我有些困惑于Promise。我正在使用Google Earth API来进行地址的“巡回演出”。一次“巡回演出”只是一个大约持续一分钟的动画,当一个完成后,下一个应该开始。
这是我的执行“巡回演出”的函数:
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;
});
});
}
这似乎运行得相当不错。它启动了动画并返回一个承诺,在动画完成时解决。现在我有一个地址数组,并且我想对它们进行循环遍历:
$scope.addresses.forEach(function (item) {
tourAddress(item.address).then(function(){
$log.log(item.address + " complete");
});
});
当我这样做时,它们都同时执行(Google Earth对最后一个地址进行动画处理),并且它们都同时完成。如何将它们链接起来,在前一个完成后再触发下一个?
更新:
我使用了@phtrivier的帮助来实现它:
$scope.addresses.reduce(function (curr,next) {
return curr.then(function(){
return tourAddress(next.address)
});
}, Promise.resolve()).then(function(){
$log.log('all complete');
});
reduce
就是我要找的。我会看看能否让它正常工作。 - Jonesopolis_.reduce
?你同样可以使用addresses.reduce
。 - Benjamin Gruenbaum