Angular 路由解析上的RxJS forkJoin句柄错误

Angular 路由解析上的RxJS forkJoin句柄错误,angular,rxjs,observable,fork-join,Angular,Rxjs,Observable,Fork Join,在尝试执行路由解析时,我似乎无法找到捕获/处理forkJoin内部错误的方法 我已经为帐户页创建了一个路由解析程序,它应该在路由之前返回2个请求。现在有一部分我无法解决:若用户并没有订阅,那个么404将从服务器返回。我想处理这个问题,如果发生这种情况,用户应该被路由到另一个页面,从那里他可以进行订阅 import { Injectable } from '@angular/core'; import { Resolve, ActivatedRouteSnapshot } from '@angul

在尝试执行路由解析时,我似乎无法找到捕获/处理forkJoin内部错误的方法

我已经为帐户页创建了一个路由解析程序,它应该在路由之前返回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()
        ]);
    };
}
从'@angular/core'导入{Injectable};
从'@angular/router'导入{Resolve,ActivatedRouteSnapshot};
从'rxjs/Rx'导入{Observable};
从“/account.service”导入{AccountService};
@可注射()
导出类AccountResolver实现解析{
构造函数(私有accountService:accountService){}
解析(路由:ActivatedRouteSnapshot):可观察{
返回可观察的forkJoin([
此.accountService.getUser()为,
this.accountService.getUserSubscriptions()
]);
};
}

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

您可以捕获错误,并重定向到所需的路由,如下所示:

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

    resolve(route: ActivatedRouteSnapshot): Observable<any> {
        return Observable.forkJoin([
            this.accountService.getUser(),
            this.accountService.getUserSubscriptions()
                .catch(error => {
                    if(error.status === 404) {
                        this.router.navigate(['subscription-create']);
                    }

                    return Observable.throw(error);
                })
        ]);
    };
}
@Injectable()
导出类AccountResolver实现解析{
建造商(私人账户服务:账户服务、,
专用路由器:路由器{}
解析(路由:ActivatedRouteSnapshot):可观察{
返回可观察的forkJoin([
此.accountService.getUser()为,
this.accountService.getUserSubscriptions()
.catch(错误=>{
如果(error.status==404){
this.router.navigate(['subscription-create']);
}
返回可观察抛出(错误);
})
]);
};
}

这样,错误会得到处理,但也会以原始形式返回到
resolve
方法,因此解析器可以拒绝访问以前的目标路由(默认情况下,
forkJoin
中的任何失败请求都会导致
forkJoin
本身失败).

这取决于错误发生的位置,而从您的示例来看,错误并不十分明显

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


这只会将错误替换为
null
,这样您就可以在
forkJoin

的订阅服务器中处理它。Allready尝试了它,但没有任何帮助。我得到了这个错误:类型为“(error:any)=>void”的参数不能分配给类型为“(err:any,catch:Observable)=>ObservableInput”的参数。类型“void”不可分配给类型“observateInput”。我的问题是,我不知道内部捕获必须返回。谢谢!只是想知道,为什么他会捕捉到错误并返回可观察的结果呢?关键不是要成功解决路由依赖关系,而是要检查404错误并相应地重定向。。
return Observable.forkJoin([
    this.accountService.getUser(),
    this.accountService.getUserSubscriptions()
        .catch(err => {
            // Logic based on the err parameter
            return Observable.of(null);
        })
]);