在 rxjs 中,可观察对象和主题之间有什么区别?
2022-08-30 04:56:19
我正在浏览这个博客并阅读有关可观察量的信息,但无法弄清楚可观察量和主题之间的区别。
在流编程中,有两个主要接口:Observable和Observor。
Observable是针对消费者的,它可以被转换和订阅:
observable.map(x => ...).filter(x => ...).subscribe(x => ...)
观察者是用于为可观察源提供接口的接口:
observer.next(newItem)
我们可以使用观察器创建新的可观察对象:
var observable = Observable.create(observer => {
observer.next('first');
observer.next('second');
...
});
observable.map(x => ...).filter(x => ...).subscribe(x => ...)
或者,我们可以使用同时实现 Observable 和 Observer 接口的 Subject:
var source = new Subject();
source.map(x => ...).filter(x => ...).subscribe(x => ...)
source.next('first')
source.next('second')
可观察量在设计上是单播的,而主题在设计上是多播的。
如果您看一下下面的示例 - 每个订阅接收不同的值,作为通过设计作为单播开发的可观察量。
import {Observable} from 'rxjs';
let obs = Observable.create(observer=>{
observer.next(Math.random());
})
obs.subscribe(res=>{
console.log('subscription a :', res); //subscription a :0.2859800202682865
});
obs.subscribe(res=>{
console.log('subscription b :', res); //subscription b :0.694302021731573
});
如果您期望在两个订阅上具有相同的值,这可能会很奇怪。
我们可以使用主题来克服这个问题。主题类似于事件发射器,它不会为每个订阅调用。考虑以下示例。
import {Subject} from 'rxjs';
let obs = new Subject();
obs.subscribe(res=>{
console.log('subscription a :', res); // subscription a : 0.91767565496093
});
obs.subscribe(res=>{
console.log('subscription b :', res);// subscription b : 0.91767565496093
});
obs.next(Math.random());
两个订阅都得到了相同的输出值!