RxJS 5可观测源是否可以被链下游的另一个源阻止?

RxJS 5可观测源是否可以被链下游的另一个源阻止?,rxjs,observable,Rxjs,Observable,RxJS 5Angular 2 RC4应用程序,使用Typescript 1.9编写: 我在一条链中有两个可见物。我想,如果在第二个条件得到满足,第一个将立即完成。我的努力似乎过于复杂。在下面的示例中,我尝试在第一个可观察对象发出3个值后停止它: source = Observable.interval(1000) .do(()=>this.print("*******EMITTING from Source*******")) .switchMap(cou

RxJS 5
Angular 2 RC4
应用程序,使用
Typescript 1.9
编写:

我在一条链中有两个可见物。我想,如果在第二个条件得到满足,第一个将立即完成。我的努力似乎过于复杂。在下面的示例中,我尝试在第一个可观察对象发出3个值后停止它:

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个值,而在第4个值上中止或完成链吗
  • 您可以使用来执行此操作。
    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()
    。在您的示例中,
    贴图
    部分发出可见光如:

  • 下一步(0),完成()
  • 下一步(1),完成()
  • 下一步(2),完成()
  • 完成()
  • 完成()
  • 完成()
  • 完成()
  • …(无限继续)
  • 开关
    部分会切换这些观察值,并一直等待即将到来的观察值

    编辑

    您的示例也可以写成:

    source = Observable.interval(1000)
            .do(()=>this.print("*******EMITTING from Source*******"))
            .takeWhile(count => count < 3);
    

    谢谢你的提示
    .take()
    在这里工作(+1)。我用这个作为一个简单的例子;我更大的问题是:如何(如果可能的话)在某种条件下从第二个观测值开始完成第一个观测值。例如,假设我在一个链中有两个可观察对象,如果第一个可观察对象发出
    true
    ,我想停止所有工作。也许一个
    takeUntil()
    会是什么意思你所说的链中的
    2个可观察对象是什么意思?可能
    takeXxx
    操作员会像你猜的那样帮助你。顺便说一句,这篇文章让我对
    takeXxx
    操作符大开眼界。我的OP在一个链中有两个可观测值(
    switchMap
    输出第二个)。我只是在寻找一种方法,从其中杀死/完成流,我打赌一个运营商会让我这么做。我将阅读您链接的文章。我添加了一个示例,如果内部
    可观察的
    发出
    真的
    ,则终止流。您是对的,这篇文章以及您在这里的回复为我提供了所需的一切。非常感谢。
    source = Observable.interval(1000)
            .do(()=>this.print("*******EMITTING from Source*******"))
            .takeWhile(count => count < 3);
    
    source = Observable.interval(1000)
            .do(()=>this.print("*******EMITTING from Source*******"))
            .switchMap(count => createSomeObservable(count))
            .takeWhile(x => x !== true);