【问题标题】:takeUntil does not work with BehaviorSubjecttakeUntil 不适用于 BehaviorSubject
【发布时间】:2019-03-26 00:16:21
【问题描述】:

我定义了以下 BehaviorSubject:

  private posts = new BehaviorSubject<any[]>([]);

并在初始化时:

ngOnInit() {
  this.posts
    .takeUntil(!this._postsLoaded)
    .subscribe(x => {
       this._postsLoaded = true;
        // do something
    });
}

但它得到以下错误,虽然它应该工作:

Property 'takeUntil' does not exist on type 'BehaviorSubject<any>'

【问题讨论】:

  • 你使用的是哪个版本的 rxjs?
  • "rxjs": "^6.0.0",
  • 那么你必须使用管道。请参阅此takeUntil 示例

标签: angular rxjs observable


【解决方案1】:

如果你想使用链式语法,你还必须安装 rxjs compat 以实现向后兼容。

npm install --save rxjs-compat

但我建议使用管道

import { takeUntil } from 'rxjs/operators';
ngOnInit() {
  this.posts.pipe(
    takeUntil(!this._postsLoaded)
    ).subscribe(x => {
       this._postsLoaded = true;
        // do something
    };
}

Stackblitz 示例

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

【讨论】:

  • 这可行,但有一个例外,认为应该只使用来自 rxjs 的 takeUntil,而不是来自 compact,因为它会引发错误
  • @Yuvals 如果您使用的是 pipe ,则不需要安装 compat 包
【解决方案2】:

有两件事:

  1. 在 RxJS 6 中你应该使用 pipable 操作符。如果您必须使用旧的“补丁”样式的运算符,则需要包含 rxjs-compat

  2. takeUntil() 运算符将另一个 Observable 作为参数,因此您现在所拥有的无论如何都会引发错误。

    也许您应该改用takeWhile()。如果您还想包含完成链的最后一个值,请参阅此答案 (RxJS takeWhile but include the last value)。

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 2018-07-28
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多