RXJS 轮询:返回一个空的可观察对象会取消轮询
RXJS Polling: returning an empty observable cancels the polling
在下面的代码片段中,当条件有效时,两个可观察请求都将轮询指定的时间间隔。但是当第一个 switchMap returns 'empty' 有条件时,轮询被取消并且第二个 switchMap 没有为轮询线程执行。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: empty;
}),
switchMap(() => {
return condition ? validObservable: empty;
}),
);
请注意,RxJs 中的 "EMPTY" 只会 "Complete" 流,而不会发出任何东西。
因此,如果第一个 switchMap 完成,它将向流中发送完成信号。 COMPLETE 不是 "normal" 发射,因此第二个 switchMap 甚至不会被触发。这样整个流就完成了,计时器就死了。
因此,根据您想要实现的目标,您可以更改为使用 combineLatest,然后两个 "child"observables 将被一起订阅(并发出它们的值 "together"),如果一个完成,然后从另一个发射的每个发射将与已完成的最后一个成功发射相结合。
但是 "solution" 很大程度上取决于您想要实现的目标。
您可以尝试 return NEVER
而不是 empty
,这样流就不会完成。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
);
在下面的代码片段中,当条件有效时,两个可观察请求都将轮询指定的时间间隔。但是当第一个 switchMap returns 'empty' 有条件时,轮询被取消并且第二个 switchMap 没有为轮询线程执行。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: empty;
}),
switchMap(() => {
return condition ? validObservable: empty;
}),
);
请注意,RxJs 中的 "EMPTY" 只会 "Complete" 流,而不会发出任何东西。
因此,如果第一个 switchMap 完成,它将向流中发送完成信号。 COMPLETE 不是 "normal" 发射,因此第二个 switchMap 甚至不会被触发。这样整个流就完成了,计时器就死了。
因此,根据您想要实现的目标,您可以更改为使用 combineLatest,然后两个 "child"observables 将被一起订阅(并发出它们的值 "together"),如果一个完成,然后从另一个发射的每个发射将与已完成的最后一个成功发射相结合。
但是 "solution" 很大程度上取决于您想要实现的目标。
您可以尝试 return NEVER
而不是 empty
,这样流就不会完成。
let pollingRequests = interval(10000).pipe(startWith(0),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
switchMap(() => {
return condition ? validObservable: NEVER;
}),
);