Type '(token: string) => Observable <{headers: HttpHe aders;}> 'нельзя присвоить типу' Observable <any>' - PullRequest
0 голосов
/ 18 февраля 2019

Я изучал rxjs и угловые уроки, пытаясь понять Observables и как связать их вместе.Исходя из всего, что я прочитал, приведенный ниже код должен работать.Но это не так, и я не понимаю, почему.

Я пытаюсь получить токен из хранилища (подделал эту часть с помощью метода getFakeToken, потому что он хорошо компилируется), затем заполняю этот токен вОбъект httpHeaders, который должен быть обернут в наблюдаемую информацию, которую я затем могу соединить вместе с другим вызовом веб-службы и вернуть эту наблюдаемую в конце дня (именно поэтому я не использую подписку).Я вынул последний вызов веб-службы (который использовал бы опции http, встроенные в метод buildHttpOptions), потому что ошибка в строке buildHttpOptions.

Я не уверен, что объясняювсе правильно, поэтому вот еще один способ выразить это: я пытаюсь асинхронно получить токен, вставить этот токен в объект httpOptions, а затем (в будущей итерации кода, который будет другим ".pipe ()" вконец оператора return), используйте его для асинхронного вызова веб-службы и возврата результата, обернутого в наблюдаемую.Первые две части (получение токена и вставка его в объект) дают сбой, и я включил их в приведенный ниже код.

Я получаю сообщение об ошибке:

[ng] ERROR in src/app/web-api/api.service.ts(57,50): error TS2322: Type '(token: string) => Observable<{ headers: HttpHe
aders; }>' is not assignable to type 'Observable<any>'.
[ng]   Property '_isScalar' is missing in type '(token: string) => Observable<{ headers: HttpHeaders; }>'.
[ng] src/app/web-api/api.service.ts(67,31): error TS2345: Argument of type 'Observable<any>' is not assignable to parame
ter of type 'OperatorFunction<string, any>'.
[ng]   Type 'Observable<any>' provides no match for the signature '(source: Observable<string>): Observable<any>'.

Код:

private getFakeToken(): Observable<string> {
    return of("123abc");
}

getGetData(): Observable<any> {
    let getToken$ = this.getFakeToken();

    let buildHttpOptions$: Observable<any> = (token: string) => { return of(
        {
            headers: new HttpHeaders({
                'Content-Type': 'application/json',
                'authorization': token
            })
        })};

    return getToken$.pipe(buildHttpOptions$);
}

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете использовать оператор map для преобразования объекта в Observable в другой объект.Затем используйте switchMap, чтобы связать ваш запрос http.

getGetData(): Observable<any> {
  return this.getFakeToken().pipe(
    map(token => ({
      headers: new HttpHeaders({
        'Content-Type': 'application/json',
        'authorization': token
      })
    })),
    switchMap(headers => /* your http request that returns an Observable */)
  );
}
...