在下面的代码段中,当条件有效时,两个可观察的请求都会在指定的时间间隔内进行轮询,但当第一个switchMap有条件地返回'空'时,轮询就会被取消,而第二个switchMap不会为轮询线程执行。但是当第一个switchMap有条件地返回 "空 "时,轮询被取消,并且第二个switchMap没有被轮询线程执行。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: empty;
}),
switchMap(() => {
return condition ? validObservable: empty;
}),
);
请注意,RxJs中的 "EMPTY "只是 "完成 "流,而不会发出任何东西。
因此,如果第一个switchMap COMPLETES,它将把完整的信号发送到流中。COMPLETE 不是一个 "正常 "的发射,因此第二个 switchMap 甚至不会被触发。这样,整个流就完成了,定时器也就停止了。
所以,根据你想要实现的目标,你可以改变,例如使用 combineLatest,那么两个 "子 "观测值将被一起订阅(并 "一起 "发射他们的值),如果一个完成,那么另一个的每个发射将与完成的最后一个成功发射合并。
但 "解决方案 "是非常取决于你想实现什么。
你可以尝试返回 NEVER
而不是 empty
所以流不会完成。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
);