我在将 bool 值的BehaviorSubject 转换为“正确”的可观察值时遇到问题。
背景:
我有一个方法 toValue() ,它接受不同的类型并将它们转换为统一的格式。可观察量也应该被识别和类型化,到目前为止这是有效的。
为了对不断变化的 bool 值使用react,我在以下reddit-link下实现了@pashozator的响应。因此我传递给我的 toValue() 方法 BehaviourSubject.asObservable(),看起来像这样:
private isFinished: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
toValue(this.isFinished.asObservable());
this.isFinished.next(true);
在toValue()方法中,转换后的BehaviorSubject不被识别为Observable、BehaviorSubject或Subject,因此我无法将其输入为Observable。
“真正的”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>);
}
// ...
为什么转换后的BehaviorSubject不被识别为Observable,如何才能将转换后的BehaviorSubject识别为Observable? 目标应该是立即处理这两种情况(“真实”和转换后的 Observable)并可以稍后订阅。
编辑:
这是正在运行的 plunkr,代码位于 app.component 的 init 函数内
最佳答案
asObservable
returns Observable
instance ,顾名思义。这是一个可观察的。 param instanceof Observable === false
表明它根本不是可观察的(可以是未定义的),或者 Observable
类与之前的类不是同一个类在此模块中导入。
项目中可以有多个RxJS包的副本。这可能是可取的事情,也可能不是。在这种情况下,重复数据删除 rxjs
包可能会有所帮助。
无论如何,检查它是否是可观察的更干净的方法是使用 is-observable
中使用的方法。包裹。考虑到该应用程序具有包括 Symbol
在内的 ES6 polyfill,因此不需要抽象。它是:
if (param && param[Symbol.observable]) ...
关于angular - 转换为 Observable 的 BahaviorSubject 不被识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50504013/