Angular 2 RC4
编写的 Typescript 1.9
source = Observable.interval(1000)
.do(()=>this.print("*******EMITTING from Source*******"))
.switchMap(count => {
if(count<3){ //just pass along the value
return Observable.create(observer=>{
observer.next(count);observer.complete()
})
}
else{ //abort by issuing a non-productive observable
return Observable.create(observer=>
observer.complete()
)
}
})
this.source.subscribe(count=>this.print('Ouput is '+count);
应用:
我有两个可观察链。我想,如果在第二个条件满足,第一个立即完成。我的努力似乎不必要地复杂。在下面的示例中,我尝试在发出3个值后停止第一个observable:
*******EMITTING from Source*******
Output is 0
*******EMITTING from Source*******
Output is 1
*******EMITTING from Source*******
Output is 2
*******EMITTING from Source*******
*******EMITTING from Source*******
*******EMITTING from Source*******
这是输出:
_prouctInfo
所以,从功能上来说,我得到了我想要的结果,因为更宽的脚本在三次输出后停止收到通知。但是,我确信有更好的方法。我的问题是:
答案 0 :(得分:5)
您可以使用take
operator来执行此操作。take
获取前N个事件并完成流。
this.source = Observable.interval(1000)
.do(()=>this.print("*******EMITTING from Source*******"))
.take(3);
this.source.subscribe(count=>this.print('Ouput is '+count);
您的示例的流未完成,因为当内部流完成时switchMap
的外部流未完成。 switchMap()
等于map().switch()
。在您的示例中,map
部分会发出 observables ,如:
switch
部分切换那些可观察的部分,并一直等待即将到来的观察者。
修改强>
你的例子也可以写成:
source = Observable.interval(1000)
.do(()=>this.print("*******EMITTING from Source*******"))
.takeWhile(count => count < 3);
编辑2
关于您的评论,如果要在内部流发出true
时终止流:
source = Observable.interval(1000)
.do(()=>this.print("*******EMITTING from Source*******"))
.switchMap(count => createSomeObservable(count))
.takeWhile(x => x !== true);