take(1) vs firstValueFrom vs observable.value

Mic*_*ely 5 rxjs angular2-observables angular

在我的项目中,我使用BehaviorSubjects 作为数据存储来存储应用程序的状态。

我只需要存储中当前保存的当前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);
Run Code Online (Sandbox Code Playgroud)

mar*_*tin 13

基本上使用take(1)orfirstValueFrom是相同的,因为它们异步访问值:

myStore$.pipe(
  take(1)
).subscribe(value => {...});
Run Code Online (Sandbox Code Playgroud)

firstValueFrom将 Observable 转为 Promise,这样你就可以使用async/ await

const value = await firstValueFrom(myStore$.pipe(
  take(1)
));
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

现场演示:https://stackblitz.com/edit/rxjs-npalak?devtoolsheight=60

  • @marlin 当您在使用它时已经获得了第一个值时,在firstValueFrom方法中使用take(1)有什么意义。 (3认同)