Angular - 仅在尚未请求值时使用 Observable

Angular - using an Observable only when value not requested yet

我有一个 Web 应用程序,有时需要使用令牌来访问我的第三方合作伙伴端点。

此令牌位于我的数据库中,并在我自己服务器的端点中获取。

我正在尝试构建一个仅在我的后端请求令牌的结构,这是第一次调用某些需要它的函数。当我已经有了令牌时,我将在我的局部变量上使用它。

export class Service {
    private readonly api_url: string = environment.API_URL;
    private token: string;

    getToken(): Observable<any> {
        // HTTP call to get the token on my own backend and return the token
    }

    partnerFirstFunction(): Observable<any> {
        if (!this.token)
            this.getToken().subscribe((response) => {
                this.token = response;

                var headers = new HttpHeaders({ 'Authorization': 'bearer ' + this.token });
                return this.http.request<any>('POST', 'partnerUrl', { headers: headers }).pipe(map(response => {
                    return response;
                }));
            });
        // I WANT TO PREVENT THE ABOVE CODE FROM REPEATING
        else {
            var headers = new HttpHeaders({ 'Authorization': 'bearer ' + this.token });
            return this.http.request<any>('POST', 'partnerUrl', { headers: headers }).pipe(map(response => {
                return response;
            }));
        }
    }

    partnerSecFunction(): Observable<any> {
        if (!this.token)
            this.getToken().subscribe((response) => {
                this.token = response;

                var headers = new HttpHeaders({ 'Authorization': 'bearer ' + this.token });
                return this.http.request<any>('POST', 'partnerUrl', { headers: headers }).pipe(map(response => {
                    return response;
                }));
            });
        // I WANT TO PREVENT THE ABOVE CODE FROM REPEATING
        else {
            var headers = new HttpHeaders({ 'Authorization': 'bearer ' + this.token });
            return this.http.request<any>('PATCH', 'partnerUrl', { headers: headers }).pipe(map(response => {
                return response;
            }));
        }
    }
}

我试图为我的令牌变量构建一个 get/set,在 get 方法中进行“已经存在”的验证,但是当需要请求令牌时,代码会继续而不等待请求。

private _token: string;
get token(): string {
    if (this._token == null)
        this.getToken().subscribe((response) => {
            return this._token;
        });
    else
        return this._token;

}

也许你应该使用

private static token: string;

因此该令牌字段将为服务的所有实例初始化一次class

您可以在 HTTP 请求中使用 shareReplay 运算符,并将其分配给一个可观察对象 token$,您可以使用它来获取令牌,然后 switch/merge 映射结果其他请求。

您可以尝试以下方法:

export class Service {
  token$: Observable<string>;

  constructor() {
    // shareReplay will share the result of the request for all subscribers
    // replace of('NEW_TOKEN') with your http request.
    this.token$ = of('NEW_TOKEN').pipe(shareReplay(1));
  }

  partnerFirstFunction(): Observable<any> {
    return this.token$.pipe(
      switchMap(token => {
        var headers = new HttpHeaders({
          Authorization: 'bearer ' + token
        });
        return this.http
          .request<any>('POST', 'partnerUrl', { headers: headers })
          .pipe(
            map(response => {
              return response;
            })
          );
      })
    );
  }

  partnerSecFunction(): Observable<any> {
    return this.token$.pipe(
      switchMap(token => {
        var headers = new HttpHeaders({
          Authorization: 'bearer ' + token
        });
        return this.http
          .request<any>('PATCH', 'partnerUrl', { headers: headers })
          .pipe(
            map(response => {
              return response;
            })
          );
      })
    );
  }
}