TakeUntil官方文档对这个运算符的解释是:Emitvaluesuntilprovidedobservableemits。即可以给它另外一个Observable作为锚点,当锚点Observable发出值时,原来的Observable停止发射值,进入完成操作。看一个实际例子:import{interval,timer}from'rxjs';import{takeUntil}from'rxjs/operators';//每1s发出值constsource=interval(1000);//5秒后,发出valueconsttimer$=timer(5000);//当定时器在5s后发出时,完成sourceconstexample=source.pipe(takeUntil(timer$));//output:0,1,2,3constsubscribe=example.subscribe(val=>console.log(val));sourceObservable发出一系列整数开始为0,每1秒递增1。我们构造一个定时器Observable,超时间隔为5秒,即在第5秒,Observable发出一个值。这个计时器Observable作为通知Observable传递给takeUntil,五秒后,源Observable停止发射整数。最后,上面程序执行的输出:4秒内打印0~4,然后结束。另一个例子:constinterval=interval(1000);constclicks=fromEvent(document,'click');constresult=interval.pipe(takeUntil(clicks));结果.订阅(x=>console.log(x));本例中使用interval作为原始Observable,clicks作为通知Observable。整个程序的表现是每1秒打印一个自增1的整数序列,直到页面发生点击事件,终止原来的intervalObservable。看另一个例子://RxJSv6+import{interval}from'rxjs/observable/interval';import{takeUntil,filter,scan,map,withLatestFrom}from'rxjs/operators';//emitevery1sconstsource=interval(1000);//是偶数吗?constisEven=val=>val%2===0;//只允许偶数constevenSource=source.pipe(filter(isEven));//保持运行偶数总数outconstevenNumberCount=evenSource.pipe(scan((acc,_)=>acc+1,0));//直到5个偶数发出后才发出constfiveEvenNumbers=evenNumberCount.pipe(filter(val=>val>5));constexample=evenSource.pipe(//也给我显示当前的偶数计数withLatestFrom(evenNumberCount),map(([val,count])=>`Evennumber(${count}):${val}`),//当发出五个偶数时,完成源可观察takeUntil(fiveEvenNumbers));/*Evennumber(1):0,Evennumber(2):2Evennumber(3):4偶数mber(4):6偶数(5):8*/constsubscribe=example.subscribe(val=>console.log(val));我们逐行分析这个例子的逻辑:constevenSource=source.pipe(filter(isEven));生成一个每1秒发出一个偶数的Observable。constevenNumberCount=evenSource.pipe(扫描((acc,_)=>acc+1,0));累加生成偶数的个数constfiveEvenNumbers=evenNumberCount.pipe(filter(val=>val>5));当生成的偶数大于5时,发出该值。这个Observable作为takeUntil的通知Observable。constexample=evenSource.pipe(//也给我显示当前的偶数withLatestFrom(evenNumberCount),map(([val,count])=>`Evennumber(${count}):${val}`),//当发出五个偶数时,完成源可观察takeUntil(fiveEvenNumbers));使用eventSource和eventNumberCount,通过withLatestFrom连接两个Observable,这样在mapOperator中,可以同时打印出当前发出的偶数个值和偶数合计。通过takeUntil传入一个只在偶数总数大于5时才发射值的Observable,这样interval就可以在偶数总数大于5后停止发送值。最终执行效果:
