Typescript Rxjs运算符类似于CombineTest,但只有一个发出
在Typescript Rxjs运算符类似于CombineTest,但只有一个发出,typescript,rxjs,Typescript,Rxjs,在CombineTest的RxJs文档中,有writent: 请注意,CombineTest在每个 observable发出至少一个值 是否有一个运算符像combineLatest那样工作,但即使只有一个可观察对象发出值,也会发出值?假设可观察对象是一个可观察对象数组 combineLatest(...observables.map( s => s.pipe( startWith(null) ) )).pipe( filter(arr => arr.filter(
CombineTest
的RxJs文档中,有writent:
请注意,CombineTest在每个
observable发出至少一个值
是否有一个运算符像
combineLatest
那样工作,但即使只有一个可观察对象发出值,也会发出值?假设可观察对象
是一个可观察对象数组
combineLatest(...observables.map(
s => s.pipe(
startWith(null)
)
)).pipe(
filter(arr => arr.filter(x => x != null).length > 0)
)
这将在源可观测对象尚未发射的任何位置发射一个空数组。它还过滤掉整个阵列为空的第一个发射
根据评论更新: 同样的事情,但可能更健壮一些,因为它允许使用开发人员知道的形状的虚拟值 您可以将“null”替换为任何内容。例如:
combineLatest(...observables.map(
s => s.pipe(
startWith({dummy: true})
)
)).pipe(
filter(arr => arr.filter(x => !x?.dummy).length > 0)
)
更新以提高性能: 在scale中,循环数组以查看是否所有值都是void/dummy值对性能不利。由于(在本例中)我们只想忽略第一次发射,因此此自定义操作符可以在根本不检查值的情况下执行此操作
filterFirst(n)
将忽略第一个n
emmission:
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(
filter(arr => arr.filter(x => x != null).length > 0)
)
这将在源可观测对象尚未发射的任何位置发射一个空数组。它还过滤掉整个阵列为空的第一个发射
根据评论更新: 同样的事情,但可能更健壮一些,因为它允许使用开发人员知道的形状的虚拟值 您可以将“null”替换为任何内容。例如:
combineLatest(...observables.map(
s => s.pipe(
startWith({dummy: true})
)
)).pipe(
filter(arr => arr.filter(x => !x?.dummy).length > 0)
)
更新以提高性能: 在scale中,循环数组以查看是否所有值都是void/dummy值对性能不利。由于(在本例中)我们只想忽略第一次发射,因此此自定义操作符可以在根本不检查值的情况下执行此操作
filterFirst(n)
将忽略第一个n
emmission:
function filterFirst<T>(n: number): MonoTypeOperatorFunction<T>{
return s => defer(() => {
let count = 0;
return s.pipe(
filter(_ => n <= count++)
)
});
}
我想您正在寻找withLatestFrom。您可能正在寻找
merge
。但它只发出发出的值,而不是其他可观测值。另一种方法是:您可以通过管道将combinelateest
的每个可观测值通过startWith
@Mrk Sef发出一个初始值。在我看来,这个答案几乎是合法的,但引入潜在的null
值的代价是。你问这个问题的根本原因是什么?我觉得可能可以用更优雅的方式来处理它。我认为您正在寻找withLatestFrom。您可能正在寻找merge
。但它只发出发出的值,而不是其他可观测值。另一种方法是:您可以通过管道将combinelateest
的每个可观测值通过startWith
@Mrk Sef发出一个初始值。在我看来,这个答案几乎是合法的,但引入潜在的null
值的代价是。你问这个问题的根本原因是什么?我觉得可以用更优雅的方式来解决这个问题。唯一的(小)问题可能是[null,…,null]
是否是一个合适的值。更安全的做法是在一般情况下使用唯一的符号/引用。好的一点:进行了更新:)显然!正是我所寻找的@arturgrzesiak,我做了第二次更新,我认为这符合一般情况,也应该更快。唯一的(小)问题可能是[null,…,null]
的值是否合适。更安全的做法是在一般情况下使用唯一的符号/引用。好的一点:进行了更新:)显然!正是我所寻找的@arturgrzesiak,我做了第二次更新,我认为这符合一般情况,也应该更快。