javascript - 返回正确的 Observable<Response> 而不是 Promise 本身

标签 javascript angular typescript

我正在制作一个 HTTP 请求拦截器并且我正在覆盖 Http模块 get方法,以便我可以自动将 JWT token 添加到 header 。

我已经用下面的代码试过了,但是从方法返回时我得到了以下错误:

Type Promise<Observable<Response>> is not assignable to type Observable<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/

相关文章:

javascript - 当第一个 "things"返回之前总数未知时,在循环中批量运行大量异步 "thing"的优雅方法?

javascript - 如何在 Typescript 的回调中访问类变量?

Angular2 - *ngIf 在从 Web 服务获取的字符串插值上

javascript - 空值不会以 Angular 4 形式提交

angular - 在primeNG中使用toast确认删除记录

visual-studio - TypeScript build设置 "Compile on Save"在 VS 2015 中不起作用,.js 文件仅在构建期间生成

javascript - Angular 2 : Bind form context to ngTemplateOutlet

javascript - 使用 jQuery 提交表单时的竞争条件

javascript - 如何知道nginx是否正在压缩gzip?

javascript - 单击按钮时出现不需要的蓝色选择突出显示(仅限 Safari)