【问题标题】:AngularJS get value from service functionAngularJS 从服务函数中获取价值
【发布时间】:2016-11-20 16:03:13
【问题描述】:

我在从控制器中的服务中获取价值时遇到问题。 我使用服务从 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()函数。

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

【问题讨论】:

  • 请阅读blog.ninja-squad.com/2015/05/28/angularjs-promises,因为您使用的是不推荐使用(并在 1.6 中删除)的 success() 和 error(),并且您使用的是反模式,而不是使用链接。
  • 您不需要将 $http 调用包装在 promise 中。默认情况下,AngularJS 会为你创建 Promise。

标签: angularjs asynchronous q


【解决方案1】:

您忘记将结果发送到您的服务中

deferred.resolve(data);

【讨论】:

    【解决方案2】:

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

    您可以简单地返回 $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() 并传递success 和error 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 2023-03-18
      • 2015-11-05
      • 2016-01-10
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多