Reputation: 2301
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 typeObservable<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
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