簡體   English   中英

錯誤響應中斷 valueChanges [Angular2]

[英]Error response break valueChanges [Angular2]

當我訂閱表格並等待價值變化時,如果我的反應是我的服務錯誤,那么價值變化就會中斷......

這是代碼:

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.
    }

編輯

我發現了什么原因問題,它在 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);
            }
        });

    }

就是這部分: return Observable.throw(err);

如何在不中斷訂閱的情況下返回錯誤。

如果你想重新訂閱源 Observable,請在subscribe()之前使用retry()運算符

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

我知道為時已晚,但請嘗試使用 -

return throwError(err);

或者你也可以拋出一個恢復觀察。

return of(null);

或者

return EMPTY;

您還可以使用 RxJs pipe 運算符來鏈接多個 catchError 運算符,如下所示 -

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

一個拋出恢復錯誤 Observable,另一個發送恢復空 Observable。 通過這種方式,您可以向用戶顯示錯誤消息並發送一個恢復 Observable 來訂閱。 這永遠不會打破鏈條。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM