take(1) vs firstValueFrom vs observable.value
take(1) vs firstValueFrom vs observable.value
在我的项目中,我使用 BehaviorSubject
s 作为数据存储来存储我的应用程序的状态。
我只需要 current 当前保存在 BehaviorSubject
存储中的值,不需要订阅可以通过行为主体.
我发现很少有实现方法:使用 pipe(take(1))
、firstValueFrom
和 .value
。
是否都以相同的方式工作并读取 BehaviorSubject 存储中的当前值?
它们之间有什么区别,如果有的话?
private myStore$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
// reading only one current value using take(1):
this.myStore$.pipe(take(1))
.subscribe(value => console.log('current value = ', value));
// reading only one current value using firstValueFrom:
const value = await firstValueFrom(this.myStore$);
console.log('current value = ', value);
// reading only one current value using this.myStore$.value:
const value = this.myStore$.value;
console.log('current value = ', value);
基本上使用 take(1)
或 firstValueFrom
是相同的,因为它们是异步访问值的:
myStore$.pipe(
take(1)
).subscribe(value => {...});
firstValueFrom
将 Observable 变成一个 Promise,这样你就可以使用 async
/await
:
const value = await firstValueFrom(myStore$.pipe(
take(1)
));
使用BehaviorSubject.value
同步访问其值一般是。如果 BehaviorSubject
错误或取消订阅,它可能会出现意外行为:
import { BehaviorSubject } from 'rxjs';
const subject1 = new BehaviorSubject(1);
console.log(subject1.value);
subject1.error(new Error('broken'));
try {
console.log(subject1.value);
} catch (e) {
console.error(e);
}
const subject2 = new BehaviorSubject(2);
console.log(subject2.value);
subject2.unsubscribe();
try {
console.log(subject2.value);
} catch (e) {
console.error(e);
}
现场演示:https://stackblitz.com/edit/rxjs-npalak?devtoolsheight=60
在我的项目中,我使用 BehaviorSubject
s 作为数据存储来存储我的应用程序的状态。
我只需要 current 当前保存在 BehaviorSubject
存储中的值,不需要订阅可以通过行为主体.
我发现很少有实现方法:使用 pipe(take(1))
、firstValueFrom
和 .value
。
是否都以相同的方式工作并读取 BehaviorSubject 存储中的当前值? 它们之间有什么区别,如果有的话?
private myStore$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
// reading only one current value using take(1):
this.myStore$.pipe(take(1))
.subscribe(value => console.log('current value = ', value));
// reading only one current value using firstValueFrom:
const value = await firstValueFrom(this.myStore$);
console.log('current value = ', value);
// reading only one current value using this.myStore$.value:
const value = this.myStore$.value;
console.log('current value = ', value);
基本上使用 take(1)
或 firstValueFrom
是相同的,因为它们是异步访问值的:
myStore$.pipe(
take(1)
).subscribe(value => {...});
firstValueFrom
将 Observable 变成一个 Promise,这样你就可以使用 async
/await
:
const value = await firstValueFrom(myStore$.pipe(
take(1)
));
使用BehaviorSubject.value
同步访问其值一般是BehaviorSubject
错误或取消订阅,它可能会出现意外行为:
import { BehaviorSubject } from 'rxjs';
const subject1 = new BehaviorSubject(1);
console.log(subject1.value);
subject1.error(new Error('broken'));
try {
console.log(subject1.value);
} catch (e) {
console.error(e);
}
const subject2 = new BehaviorSubject(2);
console.log(subject2.value);
subject2.unsubscribe();
try {
console.log(subject2.value);
} catch (e) {
console.error(e);
}
现场演示:https://stackblitz.com/edit/rxjs-npalak?devtoolsheight=60