订阅时处理 forkJoin 中的错误

Handle error in forkJoin on subscribe

我有下一个功能:

   saveTable() {
    ...

    let promises = [];

     for (index = 0; index < this._TOTAL.length; ++index) {
       let promise = this.db.object(ref).update(this._TOTAL[index]);
       promises.push(promise);
     }

     Observable.forkJoin(promises).subscribe(() => {
       this.messagesService.createMessage('success', `Saved`);
       this.router.navigate(['/dashboard/my-calculations']);
     })
    }

在这种情况下我该如何处理错误?实际上,我只需要在我所有的承诺都解决后使用 thencatch,所以从根本上对我来说使用 forkJoin 不是。

forkJoin 如果 any(至少一个)它是 fork-joining 的 Observables 会抛出错误。您可以在错误处理程序中处理它:

Observable
    .forkJoin(promises).subscribe(() => {
        this.messagesService.createMessage('success', `Saved`);
        this.router.navigate(['/dashboard/my-calculations']);
    },
    (error) => {
        //handle your error here
    }, () => {
        //observable completes
    })

你可以按照下面的代码来做

import { catchError } from 'rxjs/operators';
import { of } from 'rxjs/observable/of';
import { forkJoin } from 'rxjs/observable/forkJoin';
  forkJoinTest() {
    const prouctIds: number[] = [1, 2, 3];
    const productRequests = prouctIds.map(id => this.productService.getProduct(id).pipe(
      catchError(error => of(`Bad Promise: ${error.message}`))
    ));

    const requests = forkJoin(productRequests);
    requests.subscribe(
      data => console.log(data) //process item or push it to array 
    );
  }

基本上使用 catchError 运算符,它会为你做

在此处查看详细信息:Way to handle Parallel Multiple Requests