Доступ к значению наблюдаемой - PullRequest
0 голосов
/ 05 октября 2018

У меня есть следующий код:

// Service
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { NbAuthService, NbAuthJWTToken } from '@nebular/auth';

interface PlatformInterface {
  id: number;
  name: string;
}

@Injectable()
export class PlatformService {

  data = [];

  constructor(
    private authService: NbAuthService,
    private http: HttpClient) { }

  getData() {
    console.log(this.authService.getToken()); // This is Observable
    return this.http.get<PlatformInterface[]>(
      'http://app-backend.test/app/platforms',
      {
        headers: new HttpHeaders({
          'Content-Type': 'application/json',
          'Authorization': 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9ldmVyZ2FtZS1iYWNrZW5kLnRlc3RcL2F1dGhcL3NpZ25pbiIsImlhdCI6MTUzODczNDc2MywiZXhwIjoxNTM4ODIxMTYzLCJuYmYiOjE1Mzg3MzQ3NjMsImp0aSI6InR1SnZLQlFHR0RXRmhGcWciLCJzdWIiOjEsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.nwf10QpYweuzukerwvzPBqhGMuwGC8o5yCr0zywCa_A'
        })
      }
    );
  }
}

// Component code
this.service.getData().toPromise().then(res => {
  this.source.load(res);
});

Я пытаюсь получить токен и сделать его похожим на "Bearer " + token.

Согласно https://akveo.github.io/nebular/docs/auth/nbauthservice#nbauthservice, NbAuthService возвращаетНаблюдаемый для токена, но я не знаю, как я могу вернуть значение после прослушивания Observable.

Я пробовал разные вещи, но не мог понять концепцию Observables.

Можеткто-нибудь помочь?

1 Ответ

0 голосов
/ 05 октября 2018

Вы хотите сначала получить AuthToken, а затем сделать второй вызов.Чтобы сделать это, вы можете map ответить, а затем вернуть действительный Observable из него.Но так как это даст вам Observable<Observable<PlatformInterface[]>>, вы можете использовать flatMap

Попробуйте это:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { NbAuthService, NbAuthJWTToken } from '@nebular/auth';
import { flatMap } from 'rxjs/operators';

interface PlatformInterface {
  id: number;
  name: string;
}

@Injectable()
export class PlatformService {

  data = [];

  constructor(
    private authService: NbAuthService,
    private http: HttpClient
  ) {}

  getData() {

    return this.authService.getToken()
      .pipe(flatMap(token => {
        return this.http.get <PlatformInterface[]>(
          'http://app-backend.test/app/platforms', {
            headers: new HttpHeaders({
              'Content-Type': 'application/json',
              'Authorization': `Bearer ${token}`
            })
          });
      }));
  }
}
...