2016-04-15 94 views
1

我有我的authservice下面给出,承诺返回对象的角度JS

myApp.factory('Authentication', 
    ['$rootScope', '$location', 'URL', '$http', '$q', 
    function ($rootScope, $location, URL, $http, $q) { 

    var myObject = { 
    authwithpwd: function (user) { 

     var dfd = $q.defer(); 
     $http 
     .post('Mart2/users/login', {email: user.email, password: user.password}) 
     .then(function (res) { 

      return dfd.resolve(res.data); 


     }, function (err) { 

      return dfd.reject(err.data); 

     }); 

     return dfd.promise; 

    } //login 
    }; 
    return myObject; 
}]); //factory 

而且我使用用户服务,服务如下:

myApp.factory('UserService', 
    ['$rootScope', '$location', 'URL', '$http', '$q', 'Authentication', 
    function ($rootScope, $location, URL, $http, $q, $Authentication) { 

    var myObject = { 
    login: function (user) { 
     $Authentication.authwithpwd(user).then(function (regUser) { 
     console.log(regUser); 
     }).catch(function (error) { 
     $rootScope.message = error.message; 
     }); 
    }, 
    getUserToken: function() { 
     return $rootScope.currentUser.apiKey; 

    }, 
    isLogged: function() { 
     if ($rootScope.currentUser) { 
     return true; 
     } else { 
     return false; 
     } 
    } 
    //login 
    }; 
    return myObject; 
}]); //factory 

我是很新的角度js。当编写服务和从控制器调用该服务时,我已经把控制台调试放在显示其返回对象的用户服务中。我得到的对象如果我做console.log(regUser)?任何想法为什么?

+2

你能澄清你的问题吗?什么是你的问题?你没有得到myObject中的返回对象吗?小提琴或plunkr也会有所帮助 –

+0

我没有从AuthenticationService的用户服务的登录方法中获得返回的承诺。我得到[对象,对象]在我已经完成console.log(regUser)。我将尝试为此创建一个小提琴 –

+0

避免使用$ rootscope - > http://stackoverflow.com/questions/36645399/save-current-user-information-and-use-it-in-controllers/ 36645460?noredirect = 1#comment60884162_36645460 – thegio

回答

0

要获取对象,您需要更改您的myObject声明。基本上你需要从登录函数返回一个promise,然后编写一个回调来获取已解析的数据。

myApp.factory('UserService', 
    ['$rootScope', '$location', 'URL','$http','$q','Authentication', 
    function($rootScope,$location, URL,$http,$q,$Authentication) { 

    var myObject = { 
    login: function(user) { 
     var defer = $q.defer(); 
     $Authentication.authwithpwd(user).then(function(regUser) { 
      console.log(regUser); 
      defer.resolve(regUser); 
     }).catch(function(error) { 
      $rootScope.message = error.message; 
      defer.reject(regUser); 
     }); 
     return defer.promise; 
    }, 
    getUserToken:function() { 
     return $rootScope.currentUser.apiKey; 
    }, 
    isLogged:function() { 
     if($rootScope.currentUser){ 
      return true; 
      } else { 
      return false; 
      } 
     }//login 
    }; 
    return myObject; 
}]); //factory 

从控制器提取物或其他一些服务,你需要编写一个回调

UserService.login(user) 
    .then(function (data) { 
     $scope.data = data; 
    }, function (error) { 
     $scope.error = error; 
    }); 

另外,在身份验证服务,你可以只是做一个“dfd.resolve”而不是“回归dfd.resolve“;因为你已经在返回dfd.promise。
我已经创建了一个提琴手here

+0

你正在将工厂和服务结合起来,实际上它们是AngularJS中的两个独立的东西。 –

+0

在上下文中如何以及何时使用服务和工厂,你可以在上面的代码中详细阐述一下当前的情况。@ EvanBechtol –