RxJS和AngularJS HTTP - 我该如何实现?

时间:2016-02-11 12:41:16

标签: http angular observable rxjs

我正在编写一个小实用程序函数,它使用必要的身份验证标头包含对AngularJS http.get的调用:

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. 返回null并检查每次调用的返回值......
  2. 抛出异常
  3. 找到一种方法来返回一个直接触发错误处理程序的RxJS Observable对象。
  4. 我想实现第三种方法,因为它可以让我统一这种方法的行为:无论发生什么,它总会返回一个可观察的方法。

    • 你对如何做到了吗?
    • 我是否必须创建一个新的Observable并合并这两个?
    • 我该怎么办?

2 个答案:

答案 0 :(得分:3)

如果usernull,您只需返回触发错误的原始观察值:

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
  }
);

答案 1 :(得分:0)

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

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();
}