control-panel
control-panel

Reputation: 275

handle asynchronous behavior firebase in angularjs

I'm trying put the authentication of my firebase in a service. But I stumbled on some problems with program flow. The response from firebase is slower and the code needs to wait for it to complete.

I tried to create a promise, but it doesnt work properly. Here is my code:

//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;
});

I already used a promise once in my code for a $http get request. But for firebase it doesnt seem to work. I get the error: Cannot read property 'then' of undefined in controller.js. Anyone an idea how I can let angular wait for the service?

Upvotes: 0

Views: 484

Answers (1)

wayne
wayne

Reputation: 3410

remember to inject $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;
});

Upvotes: 1

Related Questions