Typescript Angular2 ошибки при возврате обещания и создании наблюдаемого из него


Я пытаюсь извлечь токен из ionics storage в getToken() и затем использовать его в refreshToken(), чтобы увидеть, истек ли токен, передавая его в (this.jwtHelper.isTokenExpired(this.token), который возвращает true или false в зависимости от того, истек ли токен или нет. Я поместил комментарии в refreshToken(), где я получаю следующие ошибки

Ошибка 1:

Error: TS2345:Argument of type '(response: Response) => void' is not assignable to parameter of type '(value: Response) => void'. Types of parameters 'response' and 'value' are incompatible. Type 'Response' is not assignable to type 'Response'. Two different types with this name exist, but they are unrelated. Property 'body' is missing in type 'Response'.

Ошибка 2:

Error:(34, 46) TS2339:Property 'token' does not exist on type 'Promise<any>'.

Мой код

import {AuthHttp, JwtHelper, tokenNotExpired} from "angular2-jwt";
import {Observable} from "rxjs/Observable";
import {AuthService} from "../Services/Auth/auth.service";
import {Injectable} from "@angular/core";
import { Storage } from '@ionic/storage';
import {AlertController} from "ionic-angular";

@Injectable()
export class TokenProvider {

jwtHelper: JwtHelper = new JwtHelper();
token;

constructor(private authHttp: AuthHttp, private storage: Storage, private alertCtrl: AlertController) {
}

getToken(): Promise<any> {
  return this.storage.get('token').then(token => {
     this.token = token;
  });
}

refreshToken(): Observable<any> {

  return this.token = Observable.fromPromise(this.getToken())
    .flatMap(() => {
      if(this.jwtHelper.isTokenExpired(this.token))
      {
        return this.authHttp.get('localhost.api/refresh')
          .subscribe(   // ERROR 1 HERE
            (response: Response) => {
              this.token = response.json().token;  // ERROR 2 HERE
            },
            (error: Response) => {
              console.log(error);
            });
      }
    });
}
2 2

2 ответа:

Вы не импортируете Response в свой код. Компилятор, вероятно, запутался в том, какой Response использовать, поскольку в ваших типах может быть несколько определений:

import { Response } from '@angular/http';
Кроме того, вы не возвращаете наблюдаемое внутрь flatMap. Вы возвращаете Subscription. Верните исходное наблюдаемое следующим образом:
refreshToken(): Observable <any> {

    let observable = Observable.fromPromise(this.getToken())
     .filter(() => this.jwtHelper.isTokenExpired(this.token))
     .flatMap(() =>  this.authHttp.get('localhost.api/refresh'));
    observable.subscribe((response: Response) => {
            this.token = response.json().token;
        }, (error: Response) => {
            console.log(error);
        });
    return observable;
}

Функция refreshToken неверна

  • Вы не должны подписываться внутри операторов в RxJS
  • Get возвращает наблюдаемое (или обещание, как это кажется в вашем случае)

Попробуйте следующее:

refreshToken(): Observable<any> {    
  return this.token = Observable.fromPromise(this.getToken())
    .flatMap(() => {
      if(this.jwtHelper.isTokenExpired(this.token))
      {
        return this.authHttp.get('localhost.api/refresh')
      }
    })
    .catch(() => console.log(error))
    .map(response: Response => response.json())
    .subscribe(value => {
      this.token = value.token
    })
}