【问题标题】:How can I subscribe to multiple HTTP requests in Angular 6 (with rxjs 6) and ensure that all requests are made even one of them throws an error如何在 Angular 6(使用 rxjs 6)中订阅多个 HTTP 请求并确保发出所有请求,即使其中一个会引发错误
【发布时间】:2018-06-16 01:07:19
【问题描述】:

我有三个 observables,由 HttpClient 的 get() 方法返回。我使用 forkJoin 运算符是为了在所有请愿结束时获得信号。

const responses = [
  this.http.get('http://localhost:3000/articles').pipe(
    map( data => this.articles = data ),
    catchError( err => throwError("Can't get the articles list") )
  ),
  this.http.get('http://localhost:3000/notas').pipe(
    map( data => this.news = data ),
    catchError( err => throwError("Can't get the news list") )
  ),
  this.http.get('http://localhost:3000/users').pipe(
    map( data => this.users = data ),
    catchError( err => throwError("Can't get the users list") )
  )
];

forkJoin(responses).pipe(
  catchError( err => throwError(err) )
).subscribe(
  response => console.log('All data loaded')
);

如果第一个 HTTP 请求抛出错误,则发出其他 HTTP 请求,但不执行相应的回调。我在rxjs docs 上读到“如果在某些时候任何输入 Observable 错误,forkJoin 也会出错,并且所有其他 Observable 将立即取消订阅。”。所以我猜我的 forkJoin 正在按预期工作,但是我没有得到我需要的功能。

那么:如何使用 forkJoin 或任何等效方法确保发出所有请求并执行所有回调,即使其中一个抛出错误?

【问题讨论】:

  • 看来诺言在这里可能是最好的
  • @inorganik 但这对我来说似乎是一个典型的场景,HttpClient 服务与 observables 一起工作。我希望有一种方法可以用 observables 做到这一点。
  • @inorganik 你将如何使用承诺来获得我需要的东西?如果任何请求失败,Promise.all() 也会停止。
  • 似乎如果您指望请求抛出错误,那么您经常错误地构建您的应用程序。如果是空响应或 401,请将其设置为请求不会出错。通常只有 400、404 或 500 会导致您的请求出错,而这在您的应用中很少会发生
  • 我并不经常指望错误,我只是想管理外部 API(不是我的应用程序)可能抛出的错误。

标签: angular observable rxjs6


【解决方案1】:

我终于设法创建了一个自定义的 observable,当所有内部 observable 都发出或抛出错误时发出:

  public allRequests(requests: Observable<any>[]): Observable<any> {
    return new Observable(
      observer => {
        requests.forEach((request, i) => {
          request.subscribe(
            resp => {
              emitOnLast(i);
            },
            err => {
              emitOnLast(i);
              console.error(err);
            }
          );
          const emitOnLast = (n: number) => {
            if (n === requests.length - 1) {
              observer.next(this.msg);
            }
          };
        });
      }
    );
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2017-03-21
    • 2022-11-24
    • 2018-12-12
    • 2018-12-11
    • 2020-11-06
    相关资源
    最近更新 更多