RxJS-多个订阅者未使用行为主题+分享执行

时间:2019-12-24 09:10:27

标签: rxjs

示例:

import { BehaviorSubject } from 'rxjs';
import { share } from 'rxjs/operators';

const subject = new BehaviorSubject(123);
const obs = subject.asObservable().pipe(share());

obs.subscribe(console.log);

obs.subscribe(console.log);

obs.subscribe(console.log);

obs.subscribe(console.log);

我只有一个控制台日志,但是如果将其更改为shareReplay,它将调用所有订阅。

https://stackblitz.com/edit/rxjs-behaviorsubject-simpleexample-tr3fu5?file=index.ts

1 个答案:

答案 0 :(得分:2)

您为什么转换为可观察的?

一个主题已经在多播。 如果您只订阅subject怎么办?

import { BehaviorSubject } from 'rxjs';

const subject = new BehaviorSubject(123);

subject.subscribe(console.log);

subject.subscribe(console.log);

subject.subscribe(console.log);

subject.subscribe(console.log);

这句话

  

什么是主题? RxJS主题是一种特殊的Observable类型,它允许将值多播到许多Observer。普通的Observable是单播的(每个订阅的Observer拥有Observable的独立执行),而Subject是多播的。

来自official documentation

更新

此代码有效

import { BehaviorSubject } from 'rxjs';
import { share } from 'rxjs/operators';

const subject = new BehaviorSubject(null);

const obs = subject.asObservable().pipe(share());

//two new subscribers will get initial value => output: 123, 123
obs.subscribe(console.log);

obs.subscribe(console.log);

obs.subscribe(console.log);

obs.subscribe(console.log);

subject.next(1)
subject.next(2)
subject.next(3)
subject.next(4)