我想使用“ 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)


StaackBlitz:

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

附言我期望即使unsubscribe.next()也足以取消订阅,但是即使使用unsubscribe.complete()也无法正常工作。

最佳答案

您甚至在创建带有onDestroy()的链之前调用takeUntil

当您最终调用printFoo()时,不会再次排放到unsubscribe的排放,而且主题unsubscribe已经完成,因此在这种情况下takeUntil将永远不会完成链。

10-06 03:12