rxjs - 有没有像第一个操作员一样等待?

时间:2017-04-27 08:44:00

标签: rxjs observable

我有两个可观察量one$two$;

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

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

但是让我们说one$two$没有被解雇时被解雇了。我想要一种行为,其中流记住one$已经触发,并且只要two$完成就会至少触发一次。

干杯

3 个答案:

答案 0 :(得分:2)

这看起来只有当所有源Observable都发出[1] train-mlogloss:1.259886 [2] train-mlogloss:0.963367 [3] train-mlogloss:0.755535 [4] train-mlogloss:0.601647 [5] train-mlogloss:0.478923 ... 项时,才能使用zip()运算符发出n项:

n

我只是添加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)); 来模拟异步行为(有关详细信息,请参阅combineLatest behaviour in Rxjs 5?

这将打印到控制台:

Scheduler.async

只有当您知道a1 只会发出一次时才会这样。

最终你可以使用需要所有源Observable的one$发出至少一个项目,然后发出任何你可以忽略combineLatest()选择器功能的发射。

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$

答案 1 :(得分:1)

CombineLatest做你想要的。您只需提供投影仪功能:

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

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

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

另外,请检查combineLatest behaviour in RxMarbles

official documentation for combineLatest

答案 2 :(得分:0)

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

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