如果不满足某些条件,请尝试从后端服务器获取结果

问题描述 投票:0回答:1

我正试图从服务器获取结果,然后重试,直到使用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不会再次触发

angular rxjs
1个回答
1
投票

这似乎是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([() => !resultsFoundresultsFound = true)时,它将自动退订从外部观测器开始。

© www.soinside.com 2019 - 2024. All rights reserved.