我有两个工厂:getPosition
获得当前位置,geoCoding
使用谷歌反向地理编码获得城市名称。它们都使用$q.defer(),并且都将接收到的数据写入本地存储。我想在页面加载时链接它们。因此,位置应该将当前位置写入本地存储,然后地理编码应该立即解码它。我试着像那样把它们串起来:
getPosition.get().then(function(geoInfo){
$scope.$storage.geoInfo = geoInfo;
return geoCoding.get().then(function(city){
$scope.$storage.city = city;
$scope.city = $scope.$storage.city;
},function(reason){
alert("Geocoding error: " + reason);
})
}, function(reason){
alert("Location error: " + reason);
});
但是这样我只能在初始页面加载时获得位置,在页面刷新时获得城市。我已经阅读了文档和搜索stackoverflow,但我仍然错过了一些东西。如何链接调用,以便在页面加载时接收它们?
没有测试过,但也许你可以尝试这样做:
getPosition
.get()
.then(function(geoInfo){
$scope.$storage.geoInfo = geoInfo;
return geoCoding.get();
})
.then(function(city){
$scope.$storage.city = city;
$scope.city = $scope.$storage.city;
})
.catch(function(error){
alert("Error: " + error);
});
不确定你是否可以用$q
做到这一点,但我已经用了bluebird
。这似乎与承诺在then()
调用中添加更多then()
调用的主要好处背道而驰。这和地狱承诺要阻止的回调是一样的。所以,如果你不能像上面那样把所有的承诺都链起来,我会很惊讶。
当我直接使用从第一次调用接收到的数据而不写入本地存储时,问题解决了。我不知道为什么它只这样工作,但无论如何,它工作