javascript - Angular promise 不起作用

标签 javascript angularjs asynchronous promise angular-promise

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

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

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

我试图修复这个 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。

谢谢

最佳答案

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

我想说,你应该利用 $http 方法返回 Promise,并使用 .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);
    });
  }
}

关于javascript - Angular promise 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36250976/

相关文章:

javascript - 将点击事件函数绑定(bind)到动态创建的元素

javascript - Vue,在数据数组上使用运算符

javascript - 在 Google map 中验证一个点是陆地还是水域

javascript - 如何将这些日期对象合并为一个对象

javascript - AngularJS 中的初始数据加载

javascript - 如何避免javascript中的异步?

java - Android 上的异步套接字实现

javascript - WordPress 自动填写表单

javascript - 在这个用例中 $interval 和 $timeout 之间有真正的区别吗?

javascript - Protractor 和执行顺序