我有两个工厂:getPosition
获取当前位置,geoCoding
使用Google反向地理编码获取城市名称。它们都使用$ 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,但我仍然遗漏了一些东西。如何链接调用以便在页面加载时接收它们?
答案 0 :(得分:2)
没有对此进行测试,但也许您可以尝试这样做:
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()
次呼叫的主要好处相反。这与地狱承诺旨在防止的回调相同。如果你不能像上面那样把你所有的承诺联系起来,我会感到惊讶。
答案 1 :(得分:1)
当我直接使用从第一次调用收到的数据而不写入本地存储时,问题得以解决。我不知道为什么它只是这样,但无论如何,它都有效。