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,我做了第二次更新,我认为这符合一般情况,也应该更快。