在以下代码段中,当条件有效时,将在指定的时间间隔内轮询两个可观察的请求。但是,当第一个switchMap有条件地返回“空”时,轮询将被取消,而第二个switchMap不会针对轮询线程执行。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: empty;
}),
switchMap(() => {
return condition ? validObservable: empty;
}),
);
答案 0 :(得分:1)
请注意,RxJ中的“空”只会“完成”流,而不会发出任何东西。
因此,如果第一个switchMap完成,它将沿流发送完整的信号。不会“正常”发射,因此第二个switchMap甚至不会被触发。这样一来,整个流就完成了,计时器也死了。
因此,根据您要实现的目标,您可以更改例如使用combinateLatest,然后将两个“子”可观察对象一起订阅(并“一起”发出其值),如果完成,则每个从另一个将与最后一次成功完成的发射结合。
但是“解决方案”很大程度上取决于您要实现的目标。
答案 1 :(得分:1)
您可以尝试返回NEVER
而不是empty
,以使流无法完成。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
);