2016-04-15 96 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 –