Angular链承诺紧跟在第一个承诺之后



我有两个工厂: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()调用的主要好处背道而驰。这和地狱承诺要阻止的回调是一样的。所以,如果你不能像上面那样把所有的承诺都链起来,我会很惊讶。

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

最新更新