【问题标题】:Angular Promise not working角度承诺不起作用
【发布时间】:2016-03-28 03:12:42
【问题描述】:

我尝试在用户提出的每个请求中获取一些重要的信息,例如:companyid,employeeid 等。因此,这必须在其他一切完成之前收到。

之后,用户会收到基于他在每个请求中设置的 companyid 的信息 (get/company/{companyid})。

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

我已经尝试修复这个 whit 承诺,但它不起作用。

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

服务

(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。

谢谢

【问题讨论】:

标签: javascript angularjs asynchronous promise angular-promise


【解决方案1】:

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

不如说,你应该使用$http方法的promise return,并使用.then将数据返回到链promise机制。

代码

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);
    });
  }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 2015-10-09
      • 2016-06-07
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 2016-05-07
      相关资源
      最近更新 更多