Rxjs运算符类似于combineLatest,但如果只有一个发射,则会触发该运算符



combineLatest的RxJs文档中,写有:

请注意,combineLatest在每个observable发出至少一个值。

是否有一个运算符的工作方式与combineLatest类似,但即使只有一个可观测项发出值,也会发出值?

假设observables是可观测的阵列

combineLatest(...observables.map(
s => s.pipe(
startWith(null)
)
)).pipe(
filter(arr => arr.filter(x => x != null).length > 0)
)

这将在源可观测到的尚未发射的任何位置发射一个具有null的数组。它还过滤掉整个数组为空的第一个发射。


根据注释更新:

同样的事情,但可能更健壮一点,因为它允许一个具有开发人员已知形状的伪值。

您可以将"null"替换为任何内容。例如:

combineLatest(...observables.map(
s => s.pipe(
startWith({dummy: true})
)
)).pipe(
filter(arr => arr.filter(x => !x?.dummy).length > 0)
)

更新以提高性能:

按比例,在数组中循环查看是否所有值都是空值/伪值对性能不利。由于(在这种情况下(我们只想忽略第一个发射,所以这个自定义操作符可以在根本不检查值的情况下执行此操作。

filterFirst(n)将忽略第一个n发射:

function filterFirst<T>(n: number): MonoTypeOperatorFunction<T>{
return s => defer(() => {
let count = 0;
return s.pipe(
filter(_ => n <= count++)
)
});
}

然后你可以按如下方式使用它:

combineLatest(...observables.map(
s => s.pipe(
startWith(null)
)
)).pipe(
filterFirst(1)
)

最新更新