首页 文章

转换为Observable的BahaviorSubject不被识别

提问于
浏览
2

我在将布尔值的BehaviorSubject转换为'correct' observable时遇到问题 .
Background:
我有一个方法toValue(),它采用不同的类型并将它们转换为统一格式 . 也应该识别和输入可观察量,这是迄今为止有效的 .

为了对更改的布尔值做出反应,我在以下reddit-link下实现了@ pashozator的响应 . 因此,我传递给我的toValue()方法一个BehaviorSubject.asObservable(),它看起来像这样:

private isFinished: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);

toValue(this.isFinished.asObservable());

this.isFinished.next(true);

在toValue()方法中,转换后的BehaviorSubject不会被识别为Observable,BehaviorSubject或Subject,因此我无法将其键入Observable .

"real" Observable和BehaviorSubject中的一个唯一区别是 source 属性不是 Observable ,而是 BehaviorSubject .

// inside toValue()
//...

console.log(param instanceof Observable);      // false for isFinished.asObservable()
console.log(param instanceof BehaviorSubject); // false for isFinished.asObservable()
console.log(param instanceof Subject);         // false for isFinished.asObservable()

if (param instanceof Observable) {
    observable = (param as Observable<T>);
}

// ...

Why is the converted BehaviorSubject not recognized as Observable and how is it possible to recognize and treat the converted BehaviorSubject as Observable? The aim should be that both cases ("real" and converted Observable) are treated immediately and can be subscribed to later.


EDIT:

这是工作plunkr,代码在app.component的init函数内

https://plnkr.co/edit/MDxGS5kNgYNJaPmOaGXe?p=info

1 回答

  • 1

    asObservable returns Observable instance,顾名思义 . 这是一个可观察的 . param instanceof Observable === false 表明's it'根本不是可观察的(可以是未定义的),或 Observable 类与此模块中导入的类不是同一类 .

    项目中可以有多个RxJS包副本 . 这可能是可取的或不是 . 在这种情况下,重复删除 rxjs 包可能会有所帮助 .

    无论如何,检查它是否是可观察的更清晰的方法是使用is-observable包中使用的方法 . 考虑到应用程序包含ES6 polyfill,包括 Symbol ,不需要抽象 . 它是:

    if (param && param[Symbol.observable]) ...
    

相关问题