处理angularjs中的异步行为firebase

时间:2015-05-16 09:12:20

标签: angularjs firebase promise

我尝试将 firebase 的身份验证放入服务中。但我偶然发现程序流程存在一些问题。 firebase的响应速度较慢,代码需要等待它完成。

我尝试创建承诺,但它无法正常工作。 这是我的代码:

// controller.js

articleControllers.controller('AuthController', 
    ['$scope', '$firebaseObject', 'AuthenticationService', 
    function($scope, $firebaseObject, AuthenticationService){


        $scope.login = function() {    
             AuthenticationService.login($scope.loginForm)
            .then(function(result) {
                if(result.error) {
                    $scope.message= result.error.message;
                }
                else {
                    console.log("user");
                }
            });
        };  
    }
 ]);

services.js

myApp.factory('AuthenticationService',
function($firebase, $firebaseAuth, $routeParams, FIREBASE_URL) {

    var auth = new Firebase(FIREBASE_URL);

    var myReturnObject = {

        //user login
        login: function(user) {
            return auth.authWithPassword({
                email: user.loginEmail,
                password: user.loginPassword
            },
            function(error, authData) {
                console.log("hit after .then");
                return {
                    error: error,
                    authData: authData
                }
            });
         }

    };

    return myReturnObject;
});

我已经在代码中使用了一次$ http get请求。但对于firebase来说它似乎没有用。我收到错误:无法读取属性'然后'在controller.js中未定义。 任何人都知道如何让角度等待服务?

1 个答案:

答案 0 :(得分:1)

记得注入$q

myApp.factory('AuthenticationService',
function($q, $firebase, $firebaseAuth, $routeParams, FIREBASE_URL) {

    var auth = new Firebase(FIREBASE_URL);

    var myReturnObject = {

        //user login
        login: function(user) {
          return $q(function(resolve, reject) {
            auth.authWithPassword({
                email: user.loginEmail,
                password: user.loginPassword
            }, function authCallback(error, authData) {
              if (error) {
                return reject(error);
              }
              resolve(authData);

            });
          });

         }

    };

    return myReturnObject;
});