角度链在第一个之后立即承诺

时间:2015-07-24 00:23:54

标签: javascript ajax angularjs

我有两个工厂: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,但我仍然遗漏了一些东西。如何链接调用以便在页面加载时接收它们?

2 个答案:

答案 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)

当我直接使用从第一次调用收到的数据而不写入本地存储时,问题得以解决。我不知道为什么它只是这样,但无论如何,它都有效。