AngularJS 从服务功能中获取价值

AngularJS get value from service function

我在从控制器中的服务中获取值时遇到问题。 我使用服务从 API 获取值:

angular.module('app').factory('service',
  ['$q', '$rootScope', '$timeout', '$http',
  function ($q, $rootScope, $timeout, $http) {

    // create user variable
    var user = null;

    // return available functions for use in the controllers
    return ({
      isLoggedIn: isLoggedIn,
      getUserStatus: getUserStatus,
      login: login,
      getEmail: getEmail
    });

    function isLoggedIn() {
      if(user) {
        return true;
      } else {
        return false;
      }
    }

    function getUserStatus() {
      return $http.get('/user/status')
      // handle success
      .success(function (data) {
        if(data.status){
          user = true;
        } else {
          user = false;
        }
      })
      // handle error
      .error(function (data) {
        user = false;
      });
    }

function login(username, password) {

      // create a new instance of deferred
      var deferred = $q.defer();

      // send a post request to the server
      $http.post('/user/login',
        {username: username, password: password})
        // handle success
        .success(function (data, status) {
          if(status === 200 && data.status){
            user = true;
            deferred.resolve();
          } else {
            user = false;
            deferred.reject();
          }
        })
        // handle error
        .error(function (data) {
          user = false;
          deferred.reject();
        });

      // return promise object
      return deferred.promise;

    }

    function getEmail() {
      // create a new instance of deferred
      var deferred = $q.defer();

      $http.get('/email/'+$rootScope.username)
        .success(function (data) {
          console.log(data);
          deferred.resolve();
      })
      .error(function (data) {
        deferred.reject();
      })

      return deferred.promise;
    }
}]);

我正在尝试获取并使用控制器中的值:

angular.module('app')
  .controller('myController', ['$rootScope', '$scope', '$state', '$http', '$q', 'service', function ($rootScope, $scope, $state, $http, $q, service) {

    $scope.email;

    $scope.getEmail = function() {
      // call getEmailFromDB from service
     service.getEmail()
        // handle success
        .then(function (data) {
          $scope.email = data; //here I got undefined
          console.log($scope.email);
        })
        // handle error
        .catch(function () {
          $scope.error = true;
          $scope.errorMessage = "wrong@mail.com";
        });
    };
    $scope.getEmail();
 }]);

但在控制器中有 undefined 值。

在我的控制台中:

关于$q的文档,我在服务和控制器中使用了then()函数。

有人知道问题出在哪里吗?

您忘记像这样在您的服务中发送您的结果

deferred.resolve(data);

在您的代码中,您没有 return 承诺任何内容,为此您必须调用 deferred.resolve(data)deferred.reject(data)

您可以简单地 return $http 请求来代替创建延迟对象。 示例:

function getEmail() {
    return $http.get('/email/'+$rootScope.username).then(
        function success(data){
            console.log(data);
            return data;
        }, 
        function error(data){
            console.error(data);
        }
    );
}

另请注意 .success().error() 已弃用,您应该使用 .then() 并传递 successerror 函数。