【问题标题】:Angular chaining requests in resolve解析中的角度链接请求
【发布时间】:2016-01-27 17:20:32
【问题描述】:

我有一个页面显示用户和用户活跃的位置。根据 Firebase 关于平面结构的文档,我将用户和位置存储在两个不同的节点中。我希望 ui-router 在加载页面之前解析用户和位置数组。

下面是我正在使用的代码,但我不知道如何为位置变量编写返回语句,以便它等待所有位置被检索。 (据我所见,angularfire 中没有选项可以通过一次调用来检索所有位置,认为该解决方案会非常受欢迎。)

resolve: {
      user: function(firebase, $firebaseObject, $stateParams){
        var user = $firebaseObject(firebase.user.child($stateParams.id));
        return user.$loaded().then(function(){
          return user;
        })
      },
      locations: function(firebase, $firebaseObject, user) {
        var locations = [];
        angular.forEach(user.locations, function (value, location) {
          var retrievedLocation = $firebaseObject(firebase.location.child(location));
          retrievedLocation.$loaded().then(function(){
            locations.push(retrievedLocation);
          })
        })
      }
    }

【问题讨论】:

    标签: angularjs angular-ui-router firebase angularfire


    【解决方案1】:

    你必须用 $q 实现你自己的承诺:

    function ($q, firebase, $firebaseObject, user) {
        var promiseArray = [];
        angular.forEach(user.locations, function (value, location) {
            var retrievedLocation = $firebaseObject(firebase.location.child(location));
            promiseArray.push(retrievedLocation.$loaded().then(function(){
                return retrievedLocation;
            });
        })
    
        return $q.all(promiseArray).then(function(data){
            var locations = data;
            return locations;
        });
    }
    

    注意显然您不再需要位置变量或 .then 了。你返回的可能只是:

    return $q.all(promiseArray)
    

    【讨论】:

    • 这正是我尝试过的,但由于某种原因它不起作用。它在解析块中解析,但在控制器中未定义。 $q.all(console.log()) 返回多个位置
    • 这应该可以工作......在您的控制器中,您应该注入位置。 $q.all(console.log()) 真的没有意义,不确定我是否理解。
    • 这太尴尬了。我在错误的地方放了一个支架。感谢您的回答!
    • 发生在我们最好的人身上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2016-12-17
    相关资源
    最近更新 更多