如何在Angular 6中订阅多个HTTP请求(使用rxjs 6),并确保即使其中一个请求抛出错误,也能发出所有请求

如何在Angular 6中订阅多个HTTP请求(使用rxjs 6),并确保即使其中一个请求抛出错误,也能发出所有请求,angular,observable,rxjs6,Angular,Observable,Rxjs6,我有三个观察值,由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") ) )

我有三个观察值,由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请求,但不会执行相应的回调。我读到“如果在某一点上有任何输入可观察到的错误,forkJoin也将出错,所有其他可观察到的错误将立即被取消订阅。”。所以我猜我的forkJoin是按预期工作的,但是我没有得到我需要的函数性


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

我最终管理了它,创建了一个自定义的可观察对象,当所有内部可观察对象都发出或抛出错误时,它会发出:

  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);
            }
          };
        });
      }
    );
  }
public所有请求(请求:可观察[]):可观察{
返回新的可观测数据(
观察员=>{
请求。forEach((请求,i)=>{
请求。订阅(
resp=>{
发射型(i);
},
错误=>{
发射型(i);
控制台错误(err);
}
);
常量emitOnLast=(n:number)=>{
if(n==requests.length-1){
observer.next(this.msg);
}
};
});
}
);
}

似乎承诺可能是最好的here@inorganik但对我来说,这似乎是一个典型的场景,HttpClient服务使用可观察对象。我希望有一种方法可以用可观测数据做到这一点。@inorganik你如何使用承诺来获得我所需要的?Promise.all()也会在任何请求失败时停止。似乎如果您经常指望请求抛出错误,那么您的应用程序架构就错了。如果是空响应或401,请将其设置为请求不会出错。通常只有400、404或500会导致您的请求出错,这在您的应用程序中应该很少发生。我不太指望经常出现错误,我只想管理外部API(不是我的应用程序)可能引发的错误。