我正在使用 ES6 类构建和 AngularJS 应用程序,并将 traceur 转换为 AMD 格式的 ES5。
在我的模块中,我导入拦截器类并将其注册为服务,然后使用 module.config 中的 $httpProvider.interceptors 注册此服务:
var commonModule = angular.module(moduleName, [constants.name]);
import authenticationInterceptor from './authentication/authentication.interceptor';
commonModule.service('authenticationInterceptor', authenticationInterceptor);
commonModule.config( $httpProvider => {
$httpProvider.interceptors.push('authenticationInterceptor');
});
我的拦截器类同时注入$q和$window服务,将它们保存在构造函数中以备后用。我使用调试器跟踪了这一部分,并且注入正常进行:
'use strict';
/*jshint esnext: true */
var authenticationInterceptor = class AuthenticationInterceptor {
/* ngInject */
constructor($q, $window) {
this.$q = $q;
this.$window = $window;
}
responseError(rejection) {
var authToken = rejection.config.headers.Authorization;
if (rejection.status === 401 && !authToken) {
let authentication_url = rejection.data.errors[0].data.authenticationUrl;
this.$window.location.replace(authentication_url);
return this.$q.defer(rejection);
}
return this.$q.reject(rejections);
}
}
authenticationInterceptor.$inject = ['$q', '$window'];
export default authenticationInterceptor;
当我发出一个以401响应的请求时,拦截器会适当地触发,但在“responseError”方法中,“this”变量指向窗口对象而不是我的拦截器,因此我无权访问this.$q或这个.$窗口。
我不知道为什么?有任何想法吗?