我有一个可观察到的数据呼叫,我只想给出500毫秒即可完成。如果失败,我想再试一次(我最多只能尝试三遍)。如果在任何尝试期间都成功,则我希望重试不再触发,并且希望成功返回一次。数据调用可观察到的更改基于我的过滤器更改时触发的Combinelatest。 如果所有三个方法均失败,那么我想返回错误。
我的代码中的问题是我无法重试以成功停止。而当我能够返回错误时,我就无法再启动最新的联合收割机了。我曾尝试以堆栈闪电的方式进行此操作,但由于重试始终运行,因此我无法在其中完成操作。
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)
})
}