Kid Diamond
Kid Diamond

Reputation: 2301

Return the correct Observable<Response> and not the Promise itself

I'm making an HTTP request interceptor and I'm overriding the Http module get method so I can automatically add a JWT token to the headers.

I've tried it with the following code, but I get the following error when returning from the method:

Type Promise<Observable<Response>> is not assignable to type Observable<Response>.

Even when I try to return it within a then() it gives me the same error.

How can I get the correct Observable<Response> and return it?

// ...

@Injectable()
export class AdalHttp extends Http {
  constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
    super(backend, defaultOptions);
  }

  get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    return this.getWithAdal(url, options); // <-- ERROR HERE
  }

  private getWithAdal(url: string, options?: RequestOptionsArgs): Promise<Observable<Response>> {
    return new Promise((resolve, reject) => {
      this.authenticate((authResponse) => {
        if (!options) {
          options = { headers: new Headers() };
        }

        options.headers.set('Authorization', 'Bearer ' + authResponse.accessToken);

        resolve(super.get(url, options));
      }, err => reject(err));
    });
  }

  // ...
}

Upvotes: 1

Views: 175

Answers (1)

Julia Passynkova
Julia Passynkova

Reputation: 17889

get method should return Observable. It calls getWithAdal method and returns immediately the object returned by getWithAdal. So getWithAdal should also return Observable.

Use Observable.fromPromise to convert promise to Observable, change signature of getWithAdal method to return Observable

    get(url: string, options?: RequestOptionsArgs): Observable<Response> {
      return this.getWithAdal(url, options); // <-- ERROR HERE
    }

    private getWithAdal(url: string, options?: RequestOptionsArgs): Observable<Response> {
      return Observable.fromPromise(new Promise((resolve, reject) => {
        // just make it simpler for the example.... keep your code here as is
        let options = {headers: new Headers()};
        options.headers.set('Authorization', 'Bearer ');
        resolve(super.get(url, options));
      }));
    }

Upvotes: 3

Related Questions