如果我使用,则每隔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。
答案 0 :(得分:1)
您对first()
运算符感到困惑。 first()
的定义是:
返回满足谓词条件的可观察序列的第一个元素,如果不存在这样的元素,则返回默认值。如果没有给出默认值,则会调用onError。
注意单词 observable sequence ,又名stream。这两种情况的区别如下:
您的first()
应用于返回值2的observable 2. Observable.interval()
流没有任何操作,它每3秒发送一次事件。这就是您的控制台永远不会停止记录的原因。
first()
适用于持续每隔3秒发出一次事件的Observable.interval()
。因此,first()
运算符一旦找到满足条件x===2
,就会基本上切断序列(或停止它)。满足条件时,流结束,然后返回该序列的FIRST元素。因此,您的控制台只记录一次。