承诺在角度js中返回对象

时间:2016-04-15 11:29:58

标签: angularjs angular-promise

我有我的authservice,如下所示,

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),我会得到对象吗?知道为什么吗?

1 个答案:

答案 0 :(得分:1)

要获取您需要执行的对象,请更改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'而不是&f 39;返回dfd.resolve&#39 ;;因为你已经退回了dfd.promise 我创建了一个小提琴手here