我很痛苦地理解为什么我的观察结果永远不会完成。
我的代码应该像这样工作:
isTimerEnabled$
已初始化为false switchMap
发出false时,返回Rx.Observable.never()
的函数为isTimerEnabled$
',否则映射到Rx.Observable.timer
可观察take
开始,持续1秒钟。问题在于,当我订阅所有这些时,我的观察者的complete
方法永远不会被调用。
以下是代码,可能更有帮助:
const isTimerEnabled$ = new Rx.Subject(false).switchMap(
isTimerEnabled =>
isTimerEnabled
? Rx.Observable
.timer(0, 100)
.timeInterval()
.pluck('interval')
.takeUntil(Rx.Observable.timer(1000))
: Rx.Observable.never()
)
isTimerEnabled$.subscribe(
console.log,
console.error,
() => console.log('complete !')
)
所以当我这样做时:
isTimerEnabled$.next(true)
它会在控制台上记录10次,然后就好了。(为了简单起见,我简化了我的代码片段)
感谢您的时间:)
答案 0 :(得分:1)
您可以使用 isTimerEnabled $ .complete()
,这将完成您的Observable流。
const isTimerEnabled $ = new Rx.Subject(false).switchMap(
 isTimerEnabled => ;
 isTimerEnabled
?Rx.Observable
 .timer(0,100)
 .timeInterval()&#xD ;
 .pluck('interval')
 .takeUntil(Rx.Observable.timer(1000))
:Rx.Observable.never()&# xD;
)

 isTimerEnabled $ .subscribe(
 console.log,
 console。错误,
()=> console.log('完成!')
)

 setTimeout (()=> isTimerEnabled $ .next(true),1000);
 setTimeout(()=> isTimerEnabled $ .complete(),5000);

 < script src =“https://unpkg.com/rxjs/bundles/Rx.min.js”>< / script> 代码>
&#的xD;