Angular 承诺无效

Angular Promise not working

我尝试通过用户发出的每个请求获取一些重要的信息,例如:companyid,employeeid 等。因此必须在 完成其他所有操作之前 接收到它。

之后,用户收到基于他在每次请求时设置的公司 ID 的信息 (get/company/{companyid})。

我遇到的问题是接收 companyid 的响应需要很长时间,并且 angular 已经尝试向 (get/company/{companyid}) 发出请求,显然没有 companyid然而。

我已尝试修复此 whit promise,但它不起作用。

在这里,我尝试接收有关用户的一些重要信息(我对每个请求都这样做):

服务

(function () {
    angular.module('employeeApp')
        .service('authenticationservice', authenticationservice);

    function authenticationservice($http,$location,authenticationFactory,$q,GLOBALS,$cookies) {

        this.validateUser = function () {
            var vm = this;
            vm.deferred = $q.defer();

            data = {"api_token": api_token};

            return $http.post(GLOBALS.url+'show/employee/' + $cookies.get('employeeid'),data)
                .success(function(response)
                {
                    vm.deferred.resolve(response);
                })
                .error(function(err,response)
                {
                    vm.deferred.reject(err);
                });

            return vm.deferred.promise;
        }
    }
})();

路由文件 (在我的路由文件中,我使用 authenticationservice 来设置所有重要的用户变量。)

employeeAppModule.run([
        'authenticationservice',
        'constants',
        function(authenticationservice,constants) {
            authenticationservice.validateUser()
                .then(function(response)
                {
                    constants.companyid = response.result.Employee;
                    constants.role = response.result.Role;
                    constants.name = response.result.FirstName;
                    console.log('test');
                },
                function(response){
                    console.log('error');
                });

        }
    ]);

所以问题是用户信息设置晚了,angular 已经转到我的 homeController,他在其中使用尚未设置的 companyId。

谢谢

要确保 $http return 是一个 $promise 对象,您需要检查控制器中的操作 return 是一个值并且它不是无效操作。

您当前代码中的问题是 return $http.post 在您的 validateUser 方法中有两个 return 语句。这是 returning $http.get 在 returning return vm.deferred.promise; 之前 & 这就是为什么自定义创建的承诺不会从您的方法中得到 returned。虽然通过从 $http.get 中删除第一个 return 可以解决您的问题,但我不建议进行此类修复,因为它被认为是不适合实施的模式。

我想说的是,您应该通过 $http 方法利用承诺 return,并使用 .then 到 return 数据链承诺机制。

代码

function authenticationservice($http, $location, authenticationFactory, $q, GLOBALS, $cookies) {
  this.validateUser = function() {
    var vm = this;

    data = {
      "api_token": api_token
    };

    return $http.post(GLOBALS.url + 'show/employee/' + $cookies.get('employeeid'), data)
      .then(function(response) {
      var data = response.data;
      retrun data;
    }, function(err) {
      return $q.reject(err);
    });
  }
}