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);
});
}
}
我尝试通过用户发出的每个请求获取一些重要的信息,例如: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);
});
}
}