Angular 无法使用服务实例调用可注入函数。参数值始终保持为空

Angular 无法使用服务实例调用可注入函数。参数值始终保持为空,angular,rxjs,Angular,Rxjs,我有一个angular web应用程序,它使用可能过期的访问令牌。当它们过期时,401状态响应将发送回应用程序,然后由retryWhen操作员处理。用于进行令牌刷新api调用的逻辑已放置在可注入函数中,我在@NgModule( 函数如下所示: { provide: 'tokenExpired', useValue: ({ maxRetryAttempts = 1, loginService }: { maxRetryAttempts?: number, loginService?

我有一个angular web应用程序,它使用可能过期的访问令牌。当它们过期时,401状态响应将发送回应用程序,然后由
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实例,如果不可能,还有一个singleton
HttpClient
对象,我可以在
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()下的计时器是否已返回可观察的?