RXJS重试时间超时并成功停止

时间:2019-05-31 16:38:14

标签: angular rxjs angular2-observables retrywhen

我有一个可观察到的数据呼叫,我只想给出500毫秒即可完成。如果失败,我想再试一次(我最多只能尝试三遍)。如果在任何尝试期间都成功,则我希望重试不再触发,并且希望成功返回一次。数据调用可观察到的更改基于我的过滤器更改时触发的Combinelatest。 如果所有三个方法均失败,那么我想返回错误。

我的代码中的问题是我无法重试以成功停止。而当我能够返回错误时,我就无法再启动最新的联合收割机了。我曾尝试以堆栈闪电的方式进行此操作,但由于重试始终运行,因此我无法在其中完成操作。

stackblitz

concat( throwError('Retry limit exceeded!'))

添加上述内容后,我可以看到最后的错误,但它始终会触发。

initFeeds() {

        let tempObs = combineLatest(this.search$, this.source$)
        this.feeds$ = tempObs.pipe(debounceTime(0), tap(x => console.log('query update')),  switchMap(([search, source]: any) => {
            this.searchString = search
            this.sourceString = source
            let query$;
            if (search.length === 0) {
                query$ = this.db.collection(`feeds`, ref => ref
                    .where('sources', 'array-contains', source)
                    .where('groupId', '==', environment.groupId)
                    .orderBy('publishedDate', 'desc')).snapshotChanges()
            }
            else {
                query$ = this.db.collection('feeds', ref => ref
                    .where('groupId', '==', environment.groupId)
                    .where('titleSearchArray', 'array-contains', search.toLowerCase())
                    .orderBy('title', 'asc')
                    .orderBy('publishedDate', 'desc')).snapshotChanges()
            }
            return query$.pipe(
                timeout(50),
                retryWhen(
                    errors => errors.pipe(
                        delay(500),
                        tap(() => console.log(`trying to fetch data`)),
                        take(2),
                         concat(
                                throwError('Retry limit exceeded!')
                            )
                    )
                ),
                 finalize(() => {
                    this.loadingPrvd.dismissLoader()
                }),
                catchError(() =>  throwError('Retry Failed')),

            )
        }))

        this._feedsSub = this.feeds$.pipe().subscribe(
            (data: any[]) => {
                console.log('success')
            },
            (err: any) => {
                console.error('An error occured!', err)
            })

    }

0 个答案:

没有答案