rxjs第一个运算符被反复调用?

时间:2017-07-26 15:23:34

标签: rxjs observable

如果我使用,则每隔3秒将2打印到控制台:

Rx.Observable.interval(3000)
.mergeMap(() => Rx.Observable.of(3))
.concatMap(()=>Rx.Observable.of(2).first(x=>x == 2))
.subscribe((x)=>console.log(x))

如果我使用,2只会在控制台上打印一次:

Rx.Observable.interval(3000)
.mergeMap(() => Rx.Observable.of(3))
.concatMap(()=>Rx.Observable.of(2))
.first(x=>x == 2)
.subscribe((x)=>console.log(x))

不同之处在于我链接了第一个运算符,但我不了解链的流程。我认为在这两种情况下,它应该只打印2次,因为我有一个可观察到的2。

1 个答案:

答案 0 :(得分:1)

您对first()运算符感到困惑。 first()的定义是:

  

返回满足谓词条件的可观察序列的第一个元素,如果不存在这样的元素,则返回默认值。如果没有给出默认值,则会调用onError。

注意单词 observable sequence ,又名stream。这两种情况的区别如下:

场景1:

您的first()应用于返回值2的observable 2. Observable.interval()流没有任何操作,它每3秒发送一次事件。这就是您的控制台永远不会停止记录的原因。

场景2:

first()适用于持续每隔3秒发出一次事件的Observable.interval()。因此,first()运算符一旦找到满足条件x===2,就会基本上切断序列(或停止它)。满足条件时,流结束,然后返回该序列的FIRST元素。因此,您的控制台只记录一次。