为什么即使我使用Subject取消了RxJS流,它仍能继续运行?

时间:2019-12-04 16:59:25

标签: rxjs rxjs6 rxjs-pipeable-operators rxjs-observables

我有以下代码:

  const completeSubject = new Subject<void>();

  const getData: Observable<HttpEvent<any>> = this.http.get<any>(url, options);


  const getParsedData: Observable<IResult[]> = getData.pipe(
    map((response: HttpResponse<any>) => {

      return this.processSuccessResponse(response);

    })
  );

  const intervalStream: Observable<IResult[]> = interval(1000).pipe(
    concatMap(() => getData),
    map((response: HttpResponse<any>) => {

      return this.processSuccessResponse(response, completeSubject);

    }),
    takeUntil(completeSubject)
  );

  concat(getParsedData, intervalStream);

因此,此循环进行第一个http调用,然后每秒重复一次此调用,一切正常。不过我需要能够取消它,这就是takeUntil(completeSubject)代码应该做的。但是,即使我将completeSubject.complete()completeSubject.next()设置为继续循环,我仍希望这能取消interval

我在这里做错了什么?或者如何使用其他方法取消此循环?

1 个答案:

答案 0 :(得分:0)

最后还是一个有趣的问题。问题是Subject<void>();和随后对completeSubject.next()的调用(无值)。这似乎不会触发takeUntil代码。我将其更改为Subject<boolean>();completeSubject.next(false),它的行为符合预期。

感谢@JB Nizet的帮助