RxJS forkJoin处理路由解析错误

her*_*iim 4 fork-join observable rxjs angular

在尝试进行路由解析时,我似乎无法找到一种方法来捕获/处理forkJoin中的错误.

我为Account页面创建了一个路由解析器,它应该在路由之前返回2个请求.现在这是我无法解决的部分:如果用户没有订阅,则从服务器返回404.我想处理这个问题,如果发生这种情况,用户应该被路由到另一个页面,从那里他可以订阅.

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Rx';
import { AccountService } from './account.service';

@Injectable()
export class AccountResolver implements Resolve<any> {
    constructor(private accountService: AccountService) { }

    resolve(route: ActivatedRouteSnapshot): Observable<any> {
        return Observable.forkJoin([
            this.accountService.getUser(),
            this.accountService.getUserSubscriptions()
        ]);
    };
}
Run Code Online (Sandbox Code Playgroud)

当请求getUserSubscriptions()时,如何捕获并处理服务器发送的错误404?

mar*_*tin 5

这取决于错误发生的位置,这在您的示例中并非完全明显.

如果getUserSubscriptions()调用发出错误,那么您需要在传递之前捕获它,forkJoin因为其他视图forkJoin将重新发送错误.另请注意,forkJoin要求每个源Observable至少发出一个值.这就是为什么我不能使用Observable.empty(),我需要使用例如Observable.of(null).

return Observable.forkJoin([
    this.accountService.getUser(),
    this.accountService.getUserSubscriptions()
        .catch(err => {
            // Logic based on the err parameter
            return Observable.of(null);
        })
]);
Run Code Online (Sandbox Code Playgroud)

这只会替换错误,null因此您可以在订阅者中处理它forkJoin.