RXJS轮询:返回一个空的观测值会取消轮询。

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

在下面的代码段中,当条件有效时,两个可观察的请求都会在指定的时间间隔内进行轮询,但当第一个switchMap有条件地返回'空'时,轮询就会被取消,而第二个switchMap不会为轮询线程执行。但是当第一个switchMap有条件地返回 "空 "时,轮询被取消,并且第二个switchMap没有被轮询线程执行。

  let pollingRequests = interval(10000).pipe(startWith(0),
   switchMap(() => {
    return condition ? validObservable: empty;
  }),
  switchMap(() => {
     return condition ? validObservable: empty;
  }),
);
rxjs observable polling
1个回答
1
投票

请注意,RxJs中的 "EMPTY "只是 "完成 "流,而不会发出任何东西。

因此,如果第一个switchMap COMPLETES,它将把完整的信号发送到流中。COMPLETE 不是一个 "正常 "的发射,因此第二个 switchMap 甚至不会被触发。这样,整个流就完成了,定时器也就停止了。

所以,根据你想要实现的目标,你可以改变,例如使用 combineLatest,那么两个 "子 "观测值将被一起订阅(并 "一起 "发射他们的值),如果一个完成,那么另一个的每个发射将与完成的最后一个成功发射合并。

但 "解决方案 "是非常取决于你想实现什么。


1
投票

你可以尝试返回 NEVER 而不是 empty 所以流不会完成。

 let pollingRequests = interval(10000).pipe(startWith(0),
   switchMap(() => {
    return condition ? validObservable: NEVER;
  }),
  switchMap(() => {
     return condition ? validObservable: NEVER;
  }),
);
© www.soinside.com 2019 - 2024. All rights reserved.