Цепочка, наблюдаемая с помощью сообщения HttpClient - PullRequest
0 голосов
/ 30 октября 2018

Я новичок в TypeScript (или даже JavaScript) и Angular 6. Мне нужно извлечь наблюдаемое значение, передать его в HttpClient.post и обработать ответ.

Почему-то я не могу сделать это правильно. Следующее не компилируется, так как return здесь Observable<Observable<string>>. Но как мне это правильно?

refreshTokenCall: Observable<string> = null;

refreshToken(): Observable<string> {

  if (!this.refreshTokenCall) {

    // Here is the error: Type 'Observable<Observable<string>>' is not assignable to type 'Observable<string>'.
    // Type 'Observable<string>' is not assignable to type 'string'. [2322]

    this.refreshTokenCall = this.getToken().pipe(
      map(token => {
        console.log("try refresh")
        return this.http.post<Token>(AuthService.REFRESH_TOKEN_URL, JSON.stringify({token: token})).pipe(
          map(data => data.token),
          shareReplay(),
          tap(token => { 
            console.log("save token after refresh");
            this.saveToken(token);
          }),
          finalize(() => this.refreshTokenCall = null)
        );
      })
    );

  } // if
  return this.refreshTokenCall;

Я пытался поместить вторую карту map(data => data.token) в первую pipe, но затем аргумент data имеет тип Observable<Token>. По крайней мере, синтаксически работает замена первого map на switchMap. Тогда я думаю, что у меня проблемы с документацией о switchMap

switchMap прекращает испускать элементы из ранее выпущенного внутреннего Observable и начинает испускать элементы из нового.

Я надеюсь, что условие if перехватывает все последующие вызовы. Но как-то мой наблюдаемый конвейер не обрабатывается. Записи журнала не отображаются.

Так что я тут не так делаю?

...