首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >路由解析中的RxJS forkJoin句柄错误

路由解析中的RxJS forkJoin句柄错误
EN

Stack Overflow用户
提问于 2017-03-13 09:43:15
回答 2查看 6.7K关注 0票数 4

我似乎找不出一种方法来捕获/处理forkJoin内部的错误,同时尝试进行路由解析。

我已经为帐户页面创建了一个路由解析器,它应该在路由之前返回2个请求。下面是我无法理解的部分:如果用户没有订阅,那么404将从服务器返回。我想处理这一点,如果发生这种情况,用户应该被路由到一个不同的页面,他可以在那里进行订阅。

代码语言:javascript
运行
复制
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()
        ]);
    };
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-13 09:49:59

您可以捕获错误,并按照以下步骤重定向到所需的路由:

代码语言:javascript
运行
复制
@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);
                })
        ]);
    };
}

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

票数 4
EN

Stack Overflow用户

发布于 2017-03-13 09:53:05

这取决于错误发生在哪里,从您的示例来看,这并不是完全显而易见的错误。

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

代码语言:javascript
运行
复制
return Observable.forkJoin([
    this.accountService.getUser(),
    this.accountService.getUserSubscriptions()
        .catch(err => {
            // Logic based on the err parameter
            return Observable.of(null);
        })
]);

这只会将错误替换为null,这样您就可以在forkJoin的订阅服务器中处理它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42760507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档