Angular 无法使用服务实例调用可注入函数。参数值始终保持为空
我有一个angular web应用程序,它使用可能过期的访问令牌。当它们过期时,401状态响应将发送回应用程序,然后由Angular 无法使用服务实例调用可注入函数。参数值始终保持为空,angular,rxjs,Angular,Rxjs,我有一个angular web应用程序,它使用可能过期的访问令牌。当它们过期时,401状态响应将发送回应用程序,然后由retryWhen操作员处理。用于进行令牌刷新api调用的逻辑已放置在可注入函数中,我在@NgModule( 函数如下所示: { provide: 'tokenExpired', useValue: ({ maxRetryAttempts = 1, loginService }: { maxRetryAttempts?: number, loginService?
retryWhen
操作员处理。用于进行令牌刷新api调用的逻辑已放置在可注入函数中,我在@NgModule(
函数如下所示:
{ provide: 'tokenExpired', useValue: ({
maxRetryAttempts = 1,
loginService
}: {
maxRetryAttempts?: number,
loginService?:LoginService
} = {}) => (attempts: Observable<any>) => {
return attempts.pipe(
concatMap((error, i) => {
const retryAttempt = i + 1;
if((error && error.headers && (!error.headers.get("reason-unauthorized") || !(error.headers.get("reason-unauthorized") === "authentication-token-expires-soon"))) || retryAttempt > maxRetryAttempts) {
return throwError(error);
}
loginService.requestNewToken().subscribe(success => {
console.log(
`Attempt ${retryAttempt}: retrying in ${1000}ms`
);
return timer(50);
},
error => throwError(error));
})
);
} },
return loginService.requestNewToken()
.pipe(
concatMap(success => {
console.log(`Attempt ${retryAttempt}: retrying in ${1000}ms`);
return timer(50);
}),
);
这不起作用。尽管使用注入器获取实例,但tokenExpired逻辑中的loginService变量仍然为空。有人能告诉我如何使其工作吗?我需要一个singleton
loginService实例,如果不可能,还有一个singletonHttpClient
对象,我可以在tokenExpired
函数中使用它直接调用刷新令牌api端点。它需要是singleton的原因是,我不希望对不同的数据调用多个api,在eac时调用相同的刷新令牌api其中h个由于令牌过期而无法获取数据。我只需要一个刷新令牌调用,然后将其结果分发给所有订阅者。为此,我使用share()
运算符
谢谢您有
concatMap
,您可以使用以下功能:
loginService.requestNewToken().subscribe(success => {
console.log(`Attempt ${retryAttempt}: retrying in ${1000}ms`);
return timer(50);
},
这是行不通的,因为您必须向concatMap
返回一个可观察的对象。因此,您可以这样做:
{ provide: 'tokenExpired', useValue: ({
maxRetryAttempts = 1,
loginService
}: {
maxRetryAttempts?: number,
loginService?:LoginService
} = {}) => (attempts: Observable<any>) => {
return attempts.pipe(
concatMap((error, i) => {
const retryAttempt = i + 1;
if((error && error.headers && (!error.headers.get("reason-unauthorized") || !(error.headers.get("reason-unauthorized") === "authentication-token-expires-soon"))) || retryAttempt > maxRetryAttempts) {
return throwError(error);
}
loginService.requestNewToken().subscribe(success => {
console.log(
`Attempt ${retryAttempt}: retrying in ${1000}ms`
);
return timer(50);
},
error => throwError(error));
})
);
} },
return loginService.requestNewToken()
.pipe(
concatMap(success => {
console.log(`Attempt ${retryAttempt}: retrying in ${1000}ms`);
return timer(50);
}),
);
很难判断其余部分是否有问题。我必须制作一个可复制的演示。loginService.requestToken()下的计时器是否已返回可观察的?