BehaviourSubject 与 shareReplay(1) 相同吗?

Mik*_*red 11 rxjs

在这两个例子中,subject$行为方式完全相同吗?

import { BehaviorSubject, Observable } from 'rxjs';

let source: Observable<number>;
let subject$: Observable<number>;

subject$ = new BehaviorSubject(0);

source.subscribe(x => {
  subject$.next(x);
});

Run Code Online (Sandbox Code Playgroud)
import { Observable } from 'rxjs';
import { shareReplay, startWith } from 'rxjs/operators';

let source: Observable<number>;
let subject$: Observable<number>;

subject$ = source.pipe(
  startWith(0),
  shareReplay(1)
);

Run Code Online (Sandbox Code Playgroud)

小智 5

基本区别在于,当所有订阅者取消订阅时,0 值可能会重新发送到上游,并且当没有订阅者处于活动状态时,也会有类似的微妙之处。

例如:

import { BehaviorSubject, Subject } from 'rxjs';

const source = new Subject<number>();
const subject$ = new BehaviorSubject(0);
source.subscribe((x) => {
  subject$.next(x);
});

source.next(1);
source.next(2);

let subscription = subject$.subscribe(console.log);

source.next(3);
source.next(4);

subscription.unsubscribe();

source.next(5);
source.next(6);

subscription = subject$.subscribe(console.log);

source.next(7);
source.next(8);

// Prints: 2 3 4 6 7 8
Run Code Online (Sandbox Code Playgroud)
import { Subject } from 'rxjs';
import { shareReplay, startWith } from 'rxjs/operators';

const source = new Subject<number>();
const subject$ = source.pipe(startWith(0), shareReplay(1));

source.next(1);
source.next(2);

let subscription = subject$.subscribe(console.log);

source.next(3);
source.next(4);

subscription.unsubscribe();

source.next(5);
source.next(6);

subscription = subject$.subscribe(console.log);

source.next(7);
source.next(8);

// Prints 0 3 4 6 7 8
Run Code Online (Sandbox Code Playgroud)