RxJS 和 AngularJS HTTP - 我怎样才能做到这一点?

RxJS and AngularJS HTTP - how can I achieve this?

我正在编写一个小的实用函数,它用必要的身份验证包装对 AngularJS http.get 的调用 headers:

get(endpoint: string): Observable {
    var headers = new Headers();
    this._appendAuthentificationHeaders( headers, this.user.credentials);

    return this.http.get(endpoint, { headers: headers })
            .map(res => res.json());
}

这里的要点是,如果 this.user 为 null,该方法就会崩溃。 所以我有三个选择:

  1. Return null 并在每次调用时检查 return 值...
  2. 抛出异常
  3. 找到一种方法也 return 一个 RxJS Observable object 将直接触发错误处理程序。

我想实现第三种方法,因为它可以让我统一此方法的行为:无论发生什么,它总是 return 是一个可观察的。

如果 usernull,您可以简单地 return 触发错误的原始可观察对象:

if (this.user == null) {
  return Observable.create((observer) => {
    observer.error('User is null');
  });
}

(...)

或利用 throw 运算符:

if (this.user == null) {
  return Observable.throw('User is null');
}

(...)

这样会调用subscribe方法的第二个方法:

observable.subscribe(
  (data) => {
    (...)
  },
  (err) => {
    // Will be called in this case
  }
);

我认为最干净的方法是将整个函数体包装到一个可观察的对象中,因为它将把任何意外错误转化为可观察的错误。像这样:

get(endpoint: string): Observable {
  return Rx.Observable.defer(() => {
    var headers = new Headers();
    this._appendAuthentificationHeaders(headers, this.user.credentials);
    return Rx.Observable.just(headers);
  })
  .flatMap(headers => this.http.get(endpoint, { headers: headers }))
  .map(res => res.json());
}

但是我仍然不同意 http.get 返回一个可观察的而不是一个承诺。由于这些是单值可观察量,您的函数可以是一个简单的异步函数(sry,js 而不是 ts):

async get(endpoint) {
  var headers = new Headers();
  this._appendAuthentificationHeaders(headers, this.user.credentials);
  const res = await this.http.get(endpoint, { headers })).toPromise();
  return res.json();
}