我正试图从服务器获取结果,然后重试,直到使用rxjs获得正确的结果为止。
代码段:
const intervalSub = interval(timeout).subscribe(t => {
const userSearchSub2 = this.userSearchService.getSearchResult(searchReq).subscribe(xx => {
if (xx.results) {
this.dataSource.data = xx.results.map((item: any) => item.values);
intervalSub.unsubscribe();
}
userSearchSub2.unsubscribe();
});
});
由于inerval比'getSearchResult'更快,即使我第一次尝试得到结果,getSearchResult也会执行几次。
想要的行为:
停止间隔,直到我检查getSearchResult的结果,所以如果我有我的结果,getSearchResult不会再次触发
这似乎是concatMap的一个好用例。
您有一个外部观察值(间隔),并且对于每个发出的值,您都想发出一个请求,这将创建另一个观察值(内部观察值),但是您确实在当前内部可观测值完成之前,不希望进入间隔的下一个发射。
let resultsFound = false;
interval(timeout)
.pipe(
takeWhile(() => !resultsFound),
concatMap(() => this.userSearchService.getSearchResult(searchReq)),
map(xx => {
if (xx.results) {
resultsFound = true;
return xx.results.map((item: any) => item.values);
}
return null;
}),
filter(v => !!v),
)
.subscribe(results => console.log(results))
您的情况类似于http polling。可能值得检查提供的链接。
当takeWhile
的谓词函数返回false([() => !resultsFound
,resultsFound = true
)时,它将自动退订从外部观测器开始。