【问题标题】:rxjs - is there something like an wait until first Operator?rxjs - 有没有类似等到第一个操作员的东西?
【发布时间】:2021-04-23 09:03:45
【问题描述】:

我有两个 observables one$two$;

我希望 one$ 仅在 two$ 至少被触发一次时触发。我认为这本质上是skipUntil 运算符。

one$.skipUntil(two$).subscribe()

但是假设one$ 已经被解雇,而two$ 没有。我想要一种行为,流会记住one$ 已触发并且至少会触发一次,就像two$ 一样。

干杯

【问题讨论】:

    标签: rxjs observable


    【解决方案1】:

    这看起来你可以使用 zip() 操作符,只有当它的所有源 Observables 都发出 nth 项目时,它才会发出 nth 项目:

    const one$ = Observable.from(['a1', 'a2', 'a3'], Scheduler.async);
    const two$ = Observable.from(['b1'], Scheduler.async);
    
    Observable.zip(one$, two$, (v1, v2) => v1)
      .subscribe(val => console.log(val));
    

    我添加Scheduler.async 只是为了模拟异步行为(有关更多信息,请参阅combineLatest behaviour in Rxjs 5?

    这将打印到控制台:

    a1
    

    只有当你知道one$ 只会发射一次时才可以。

    最终,您可以使用combineLatest(),它需要其所有源 Observable 至少发射一个项目,然后在任何发射时发射,您可以使用选择器函数忽略 two$

    const one$ = Observable.from(['a1', 'a2', 'a3'], Scheduler.async);
    const two$ = Observable.from(['b1', 'b2'], Scheduler.async);
    
    Observable.combineLatest(one$, two$.take(1), (v1, v2) => v1)
      .subscribe(val => console.log(val));
    

    我们知道我们只想要two$中的第一项,其余的可以忽略。
    这将打印到控制台:

    a1
    a2
    a3
    

    【讨论】:

      【解决方案2】:

      CombineLatest 做你想做的事。你只需要提供一个投影功能:

      one$.combineLatest(two$, v1 => v1).subscribe(x => console.log(x));
      

      combineLatest 等到所有可观察对象都发出至少一个值,然后发出每个可观察对象的最后一个值的组合。在您的情况下,您只需要一个可观察的值。这就是使用投影仪功能的原因。这个投影函数接收一个参数中的每个可观察值,并返回将要发射的值。

      查看 CodePen 中的示例:https://codepen.io/sanzante/pen/vjMKwg

      另外,请检查combineLatest behaviour in RxMarbles

      还有official documentation for combineLatest

      【讨论】:

        【解决方案3】:

        combineLatest 正是您想要的。此运算符在每个 observable 发出至少一个值之前不会发出初始值

        combineLatest(([one$, two$])).subscribe(([one, two]) => {
          // do what you want with those values (or value one as you wish)
        })
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-29
          • 2020-03-11
          • 2015-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多