在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)
)