【问题标题】:Angular rxjs: keep alive subcriptions handling http errorsAngular rxjs:保持活动订阅处理http错误
【发布时间】:2019-06-19 08:33:37
【问题描述】:

当一个按钮被点击时,一个 http 请求被调用:

let saveClickPush$ = Observable
    .fromEvent(this.saveButton.nativeElement, 'click')
    .pipe(
        switchMap(() => this.service.push(this.user)),
        share()
    );

所以,当它被点击时,我创建了两个可观察对象:

this.pushed$ = saveClickPush$.pipe(this.pushUser(), this.handleEmptyUser());
this.error$ = saveClickPush$.pipe(this.handleError<never>());

地点:

private handleError = <T>() => catchError<T, Array<{code: string, message: string}>>((error: ResponseError) => Observable.of(error.errors));
private handleEmptyUser = <T>() => catchError<T, AdministrationUser>(() => Observable.of(UserComponent.EMPTY_USER));

我要做的是在引发错误时:

  1. pushed$ observable 上发出一个空用户。
  2. error$ 上发出详细的错误消息。

但是,当引发 http 错误时,当我单击按钮时不会再次调用 http 请求。尽管我已尝试处理错误,但之前引发 http 错误时,似乎所有订阅者都已取消订阅。

我的服务是:

public push(user: AdministrationUser): Observable<AdministrationUser> {
    const buildURL = () => map((userId: string) => this.buildPushURL(userId));

    return Observable.of(user.id)
        .pipe(
            buildURL(),
            switchMap((url: string) => this.http.post(url, user)
                .pipe(
                    map(() => user),
                    catchError((error: Response) => Observable.throw(<ResponseError>error.json()))
                )
            )
        );
}

因此,当引发 http 错误时:

  1. 已捕获但再次引发返回 Observable.throw 处理 error response
  2. pushed$ observable 上,也可以使用
  3. 捕获

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    由于您在 this.service.push() 流中重新抛出错误,为了不破坏点击流,您必须在内部 observable 中包含并捕获错误

    let saveClickPush$ = Observable
        .fromEvent(this.saveButton.nativeElement, 'click')
        .pipe(
            switchMap(() => this.service.push(this.user).pipe(catchError(e=>of(e))),
            share()
        );
    

    【讨论】:

    • 如果您返回of(e)error$ 将永远不会发出错误详细信息,不是吗?
    • 您可以抛出自定义错误消息,然后有条件地处理它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多