【问题标题】:Observable of a timer never completes despite takeUntil尽管有 takeUntil,但计时器的 Observable 永远不会完成
【发布时间】:2017-08-31 01:58:54
【问题描述】:

我很难理解为什么我的 observable 永远不会完成。

我的代码应该是这样工作的:

  1. 主题 isTimerEnabled$ 初始化为 false
  2. isTimerEnabled$ 发出 false 时返回 Rx.Observable.never() 的函数是 switchMap'd,否则它映射到 Rx.Observable.timer observable
  3. 从计时器我take 一切持续 1 秒。
  4. 1 秒后,observable 完成

问题是当我订阅所有这些时,我的观察者的 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 次,然后 .. 就是这样(我简化了我的代码 sn-p 以实现 .. 简单)

感谢您的宝贵时间:)

【问题讨论】:

    标签: javascript rxjs rxjs5


    【解决方案1】:

    您可以使用isTimerEnabled$.complete(),这将完成您的 Observable 流。

    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 !')
    )
    
    setTimeout(() => isTimerEnabled$.next(true), 1000);
    setTimeout(() => isTimerEnabled$.complete(), 5000);
    <script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>

    【讨论】:

    • 你好,谢谢你的回复,你能用一个小代码sn-p来说明吗?
    • 也许我对我希望我的 Observable 自己完成这一事实不够具体,而不是强制要求完成这个主题。
    • 如果没有“完成”主题,就无法完成这个 Observable。如果您删除主题并将isTimerEnabled 作为函数从boolean 保留为Observable,则可以实现类似的效果,然后由于.takeUntill,该函数的结果将完成。
    猜你喜欢
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多