在 rxjs 中,可观察对象和主题之间有什么区别?

我正在浏览这个博客并阅读有关可观察量的信息,但无法弄清楚可观察量和主题之间的区别。


答案 1

在流编程中,有两个主要接口:ObservableObservor

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 => ...)

或者,我们可以使用同时实现 ObservableObserver 接口的 Subject

var source = new Subject();
source.map(x => ...).filter(x => ...).subscribe(x => ...)
source.next('first')
source.next('second')

答案 2

可观察量在设计上是单播的,而主题在设计上是多播的。

如果您看一下下面的示例 - 每个订阅接收不同的值,作为通过设计作为单播开发的可观察量。

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());

两个订阅都得到了相同的输出值!