简体   繁体   English

错误响应中断 valueChanges [Angular2]

[英]Error response break valueChanges [Angular2]

When I subscirbe to form and wait for value changes that break if I resonse is error from my service...当我订阅表格并等待价值变化时,如果我的反应是我的服务错误,那么价值变化就会中断......

Here is code:这是代码:

constructor(private fb: FormBuilder, private bankService: BankService) {
        this.page = 1;

        this.filter = this.fb.group({
            text: ['', []],
            bankC: ['', []]
        });

        this.filter.valueChanges
            // wait for a pause in typing of 200ms then emit the last value
            .debounceTime(200)
            // only accept values that don't repeat themselves
            .distinctUntilChanged()
            // map that to an observable HTTP request, using the TickerLoad
            // service and switch to that
            // observable. That means unsubscribing from any previous HTTP request
            // (cancelling it), and subscribing to the newly returned on here.
            .switchMap((val: any) => {
                return bankService.getCountry(val.bankC)
            })
            .subscribe((res) => {
                console.log(res);
            },
             (err) => {
                 console.log(err);
             });
            // send an empty array to tickers whenever clear emits by
            // merging in a the stream of clear events mapped to an
            // empty array.
    }

Edit编辑

I found what couse problem, it is inside http intreceptor:我发现了什么原因问题,它在 http 拦截器内部:

intercept(observable: Observable<Response>): Observable<Response> {
        return observable.catch((err, source) => {
            if (err.status == 401) {
                this._router.navigate(['']);
                return Observable.throw(err);
                //&& !_.endsWith(err.url, 'api/auth/login')
            } else {
               return Observable.throw(err);
            }
        });

    }

It is this part: return Observable.throw(err);就是这部分: return Observable.throw(err);

How can I return error without braking subscription.如何在不中断订阅的情况下返回错误。

If you want to resubscribe to the source Observable use retry() operator before subscribe() :如果你想重新订阅源 Observable,请在subscribe()之前使用retry()运算符

...
.switchMap((val: any) => {
    return bankService.getCountry(val.bankC)
})
.retry(-1) // resubscribe forever
.subscribe((res) => {
    console.log(res);
}, ...

I know it's too late but try using -我知道为时已晚,但请尝试使用 -

return throwError(err);

Or you can also throw a recovery observable.或者你也可以抛出一个恢复观察。

return of(null);

Or或者

return EMPTY;

You can also use RxJs pipe operator to chain multiple catchError operators like this -您还可以使用 RxJs pipe 运算符来链接多个 catchError 运算符,如下所示 -

.pipe(
    catchError((err) => throwError(err)),
    catchError((err) => of([])
);

One to throw a recovery error observable and other one to send a recovery empty Observable.一个抛出恢复错误 Observable,另一个发送恢复空 Observable。 This way you can display error message to user and send a recovery Observable to subscribe to.通过这种方式,您可以向用户显示错误消息并发送一个恢复 Observable 来订阅。 This will never break the chain.这永远不会打破链条。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM