我正在制作一个 HTTP 请求拦截器并且我正在覆盖 Http
模块 get
方法,以便我可以自动将 JWT token 添加到 header 。
我已经用下面的代码试过了,但是从方法返回时我得到了以下错误:
Type
Promise<Observable<Response>>
is not assignable to typeObservable<Response>
.
即使我尝试在 then()
内归还它它给了我同样的错误。
如何获得正确的 Observable<Response>
并归还?
// ...
@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));
});
}
// ...
}
最佳答案
get 方法应该返回 Observable。它调用 getWithAdal 方法并立即返回 getWithAdal 返回的对象。所以 getWithAdal 也应该返回 Observable。
使用 Observable.fromPromise 将 promise 转换为 Observable,更改 getWithAdal 方法的签名以返回 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));
}));
}
关于javascript - 返回正确的 Observable<Response> 而不是 Promise 本身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43743276/