如果我有.lib
,有没有办法将其转换为T?
即
Observable<T>
如何将let sum$: Observable<number>;
let sumNum: number;
设置为sumNum
中的值?
我发现sum$
会这样做,但它会创建一个不是我想要的订阅。我希望它设置一次值而不再订阅。
答案 0 :(得分:1)
如果我有一个Observable是否有办法将其转换为T?
如果我理解正确,你想要的东西(非工作!)
const value = obs$.first().value();
答案是:不,那是不可能的。 Observables是数据流随着时间的推移,所以这样的函数必须阻塞(这是一个可怕的想法 - 如果obs$
需要五分钟发出怎么办?)。阻止以及如何避免它就是承诺之类的事情诞生的原因。封锁很糟糕。
正确的解决方案是评论中提到的:
obs$.first().subscribe(value => this.value = value);
这将创建一个在obs$
发出的时刻取消订阅的订阅,因为在这种情况下first()
会导致链完成。所以没有什么可以害怕这个解决方案。
作为一个小附录,BehaviorSubject
确实附带了一个同步返回最新值的getValue()
方法。这可以得到保证,因为它类似于具有初始值的ReplaySubject
,即,在任何给定的时间点它具有至少一个发射。但是,诉诸BehaviorSubject#getValue()
通常表示做错了。