在这两个例子中,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)
| 归档时间: |
|
| 查看次数: |
2686 次 |
| 最近记录: |