代码之家  ›  专栏  ›  技术社区  ›  S Panfilov

RxJS takeUntil不退订

  •  0
  • S Panfilov  · 技术社区  · 7 年前

    我想用“takeUntil”运算符以声明式方式取消订阅。但这基本上不起作用。我可以看到控制台输出。

    const unsubscribe = new Subject();
    
    function printFoo() {
      of('foo')
        .pipe(takeUntil(unsubscribe))
        .subscribe(console.log) // Why I can see 'foo' in the  console?
    }
    
    function onDestroy() {
      unsubscribe.next();
      unsubscribe.complete();
    }
    
    onDestroy()
    setTimeout(() => printFoo(), 200)
    

    斯塔克闪电战:

    https://stackblitz.com/edit/rxjs-svfkxg?file=index.ts

    附笔。 我甚至还以为 unsubscribe.next() 取消订阅就足够了,但即使有 unsubscribe.complete() 它不起作用。

    1 回复  |  直到 7 年前
        1
  •  3
  •   martin    7 年前

    你在打电话 onDestroy() 在链条之前 takeUntil 甚至被创建。

    当你最终打电话时 printFoo() 之前排放至 unsubscribe 不会再次发射,主题 退订 反正已经完成了所以 takeUntil公司 在这种情况下,将永远无法完成链。

        2
  •  1
  •   Roberto Zvjerković sabithpocker    7 年前

    因为主体在 printFoo 订阅

    订阅后,不再有主题发射。

    您可以改用BehaviorSubject,因为它保存发出的值(最后一个值) 排放值):

    const unsubscribe = new BehaviorSubject(false);

    function printFoo() {
      of('foo')
        .pipe(takeUntil(unsubscribe.pipe(filter(value => !!value)))) // Don't unsub if it's false emitted
        .subscribe(console.log)
    }
    
    function onDestroy() {
      unsubscribe2.next(true); // Emit true to cancel subscription
    }