【问题标题】:Does angularfire 0.5.0 work with promises and if so how?angularfire 0.5.0 是否与承诺一起使用,如果可以,如何使用?
【发布时间】:2014-01-13 07:28:26
【问题描述】:

更具体地说,是否可以执行以下操作:

  1. 验证用户身份
  2. 根据该 user.id 访问个人资料
  3. 配置文件确定授权
  4. 更新私人信息

1.then(2 or err).then(3 or err).then(4 or err) 是直截了当的。

我知道有 $on('loaded', function(){ How do you access loaded data from .$on('loaded') in AngularFire 0.5.0 } 除非它已经“加载”并且仍然缓存 和 $on('change', function(){})。 类似的东西:

$scope.$on('$firebaseAuth:login', function(){
    $scope.profile = $firebase(new..);
    $scope.profile.$on('loaded', function(data){
        if(data.authorized === true){
            $scope.private = $firebase(new..);
            $scope.private.$on('loaded', function(){
                var foo = $scope.private.$child('foo');
                foo = 'bar';
                $scope.private.$save('foo');
                $scope.private.someMethod(){..}
            })
        }
    })
})

这没有考虑错误,而且似乎不是最干净的做事方式。是否可以使用带有或代替 $on 事件的承诺,如果可以,如何?如果不是,那么处理这种情况的最佳方法是什么,可以在此过程中发现任何错误?

【问题讨论】:

  • 已在 Github 上的“master”中添加了对 AngularFire 身份验证模块中承诺的支持。很快就会有一个支持 Promise 的新版本。
  • 这是个好消息,我喜欢返回的带有重要 Firebase 内置方法的对象,而且 $bind 很酷。当前版本在尝试解析依赖于来自其他异步引用的数据的 $firebase 引用时让我感到困惑。建立一个服务让我进入个人资料阶段是否可行?这将允许我开始构建一些基本的授权。
  • 我将尝试构建一个在 data.authorized === true 上得到解析的自定义承诺,然后从那里开始。

标签: angularjs angularfire


【解决方案1】:

我的解决方案是创建返回承诺的服务,负责建立 firebase 引用,并处理 $q & $on('loaded') 的东西。我发现这个tutorial on chaining promises 很有帮助。

    .service('authorizeService',['$q', '$firebase',
    function($q, $firebase){
        "use strict";
        return{
            getIsAdmin: function(profile){
                var dfrd = $q.defer();
                var firef = $firebase(new Firebase('https://YOURFIREBASE.firebaseio.com/profiles/' + profile));

                firef.$on('loaded',function(data){
                    if(data === null){
                        dfrd.reject();
                    }else{
                        dfrd.resolve({
                            displayName: data.displayName,
                            isAdmin: data.isAdmin
                        });
                    }
                });
                return dfrd.promise;
            }
        }
    }])
.service('adminService',['$q',
    function($q){
    "use strict";
        return{
            getAdmin:function(admin){
                var dfrd = $q.defer();
                if(admin){
                    dfrd.resolve({
                        adminWidget: 'Behold... The Adminopacalypse.'
                    });
                }else{
                    dfrd.resolve({
                        adminWidget: 'You are not an admin.'
                    });
                }
                return dfrd.promise;
            }
        };
    }])

控制器包含调用这些服务方法的函数,将值附加到范围,并为链中的下一个承诺返回一个对象。这些都包含在 $on('$firebase:login) 中,以便在每次新登录时启动它们。

    .controller('qtest', ['$rootScope','$scope', 'userQService', 'authorizeService', 'adminService', '$firebaseAuth',
    function($rootScope,$scope, userQService, authorizeService, adminService, $firebaseAuth){
        "use strict";
        var loadAuthorizeAdmin = function(user){
            return authorizeService.getIsAdmin(user)
                .then(function(value){
                    $scope.isAdmin = value;
                    return value.isAdmin;
                });
        };
        var loadAdmin = function(isAdmin){
            return adminService.getAdmin(isAdmin)
                .then(function(value){
                    $scope.adminWidget = value;
                    return value.adminWidget;
                });
        };

        $rootScope.$on('$firebaseAuth:login',
            function(){
                var profile = $rootScope.auth.user.provider + '-' + $rootScope.auth.user.id;
                $scope.user = profile;
                loadAuthorizeAdmin(profile)
                    .then(loadAdmin);
                    //could be further chained
            });

        $rootScope.auth = $firebaseAuth(new Firebase('https://YOURFIREBASE.firebaseio.com'));
        $scope.loginOne = function(){
            $rootScope.auth.$login('password', {email: 'test@test.foo', password: 'test'});
        }
        $scope.loginTwo = function(){
            $rootScope.auth.$login('password', {email: 'test2@test2.foo', password: 'test2'});
        }

        $scope.logout = function(){
            $scope.user = null;
            $scope.isAdmin = null;
            $scope.adminWidget = null;
            $rootScope.auth.$logout();
        }
        $scope.user = null;
        $scope.isAdmin = null;
        $scope.adminWidget = null;
    }])

总有更好的方法,但是,这行得通。我没有解决错误,但这越来越长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-25
    • 2015-07-25
    • 1970-01-01
    • 2012-05-21
    • 2021-11-16
    • 2013-08-18
    • 1970-01-01
    • 2021-11-12
    相关资源
    最近更新 更多