angular 延迟解析未定义
angular defered resolve undefined
angular 东西让我抓狂!应用程序使用 Bearer 身份验证,有一个像这样的 errorInterceptor
function errorInterceptor($injector, $log, $location) {
var inFlight = null;
var authInterceptorServiceFactory = {};
var _request = function (config) {
config.headers = config.headers || {};
var oauthToken = $injector.get('oauthService').getAuthorizationHeader();
if (oauthToken) {
config.headers.Authorization = oauthToken;
}
return config;
}
var _responseError = function (rejection) {
debugger
var deferred = $injector.get('$q').defer();
switch(rejection.status){
case 401:
console.log('401');
if(inFlight == null){
var authService = $injector.get('oauthService');
inFlight = authService.refreshToken() //this is just a $http call
}
inFlight
.then(function (response) {
_retryHttpRequest(rejection.config, deferred)
.success(function (result) {
deferred.resolve(result);
})
.error(function(err, status) {
deferred.reject(err);
})
.finally(function() {
inFlight = null;
});
$injector.get('oauthService').setLocalStorageData(response.data);
},
function (err, status) {
$injector.get('oauthService').logOut();
});
break;
}
return deferred.promise;
}
var _retryHttpRequest = function (config, deferred) {
var $http = $http || $injector.get('$http');
return $http(config);
}
authInterceptorServiceFactory.request = _request;
authInterceptorServiceFactory.responseError = _responseError;
return authInterceptorServiceFactory;
}
它几乎可以工作,第一个 401 响应发出一个 "refreshToken" 请求,然后所有后续请求都使用新令牌重新发送。
我面临的问题是
deferred.resolve(result);
虽然结果是预期的对象,但当调用 promise 函数时,它的参数是未定义的!
承诺函数
sidebarService.getMenu()
.success(sidebarReady)
.error(sidebarReadyError);
function sidebarReady(items) {
//when errorInterceptor catches the error
//and re-sends, when it resolves this funciton, argument is undefined
//
}
有人可以帮忙吗?
谢谢
只需使用 .then() 而不是 .success(),它自 Angular 1.5 起已被弃用,并在 1.6 中被删除。使用 .success() 承诺链接是不可能的,因为它没有 return 一个新的承诺来解决。
事实证明,使用 .then() 而不是 .success() 有效!
谢谢@Nekudotayim
也感谢@Ben 和@Nikolay
:)
angular 东西让我抓狂!应用程序使用 Bearer 身份验证,有一个像这样的 errorInterceptor
function errorInterceptor($injector, $log, $location) {
var inFlight = null;
var authInterceptorServiceFactory = {};
var _request = function (config) {
config.headers = config.headers || {};
var oauthToken = $injector.get('oauthService').getAuthorizationHeader();
if (oauthToken) {
config.headers.Authorization = oauthToken;
}
return config;
}
var _responseError = function (rejection) {
debugger
var deferred = $injector.get('$q').defer();
switch(rejection.status){
case 401:
console.log('401');
if(inFlight == null){
var authService = $injector.get('oauthService');
inFlight = authService.refreshToken() //this is just a $http call
}
inFlight
.then(function (response) {
_retryHttpRequest(rejection.config, deferred)
.success(function (result) {
deferred.resolve(result);
})
.error(function(err, status) {
deferred.reject(err);
})
.finally(function() {
inFlight = null;
});
$injector.get('oauthService').setLocalStorageData(response.data);
},
function (err, status) {
$injector.get('oauthService').logOut();
});
break;
}
return deferred.promise;
}
var _retryHttpRequest = function (config, deferred) {
var $http = $http || $injector.get('$http');
return $http(config);
}
authInterceptorServiceFactory.request = _request;
authInterceptorServiceFactory.responseError = _responseError;
return authInterceptorServiceFactory;
}
它几乎可以工作,第一个 401 响应发出一个 "refreshToken" 请求,然后所有后续请求都使用新令牌重新发送。 我面临的问题是
deferred.resolve(result);
虽然结果是预期的对象,但当调用 promise 函数时,它的参数是未定义的!
承诺函数
sidebarService.getMenu()
.success(sidebarReady)
.error(sidebarReadyError);
function sidebarReady(items) {
//when errorInterceptor catches the error
//and re-sends, when it resolves this funciton, argument is undefined
//
}
有人可以帮忙吗? 谢谢
只需使用 .then() 而不是 .success(),它自 Angular 1.5 起已被弃用,并在 1.6 中被删除。使用 .success() 承诺链接是不可能的,因为它没有 return 一个新的承诺来解决。
事实证明,使用 .then() 而不是 .success() 有效! 谢谢@Nekudotayim
也感谢@Ben 和@Nikolay
:)