来自 Subject 的 Observable 发出第一个值为 null

Observable from Subject emits first value as null

我正在尝试拥有一个基于 Subject 的可观察对象,以便每次 SUbject 发出时它都会更新。

出于某种原因,当尝试获取可观察对象的值时,第一个值始终为空,其余包含值。我期望检索可观察对象的最新发射值。我尝试过各种主题。我缺少什么?

...
  activeBookings$: Subject<Booking[]> = new BehaviorSubject<Booking[]>(null);
  activeBooking$: Observable<Booking> = this.activeBookings$.pipe(
    filter((bookings) => bookings?.length > 0),
    mergeMap((bookings) => this.getBookingById(bookings?.[0]?.id)),
    share()
  );
  i = 0;
  constructor(
    public http: HttpClient,
    public store: Store,
    public asyncPipe: AsyncPipe,
    public bookingStoreService: BookingStoreService
  ) {
    this.getBookings().subscribe((bookings) => {
      this.bookings$.next(bookings);
    });
    this.getActiveBookings().subscribe((bookings) => {
      this.activeBookings$.next(bookings);
    });
    this.getPreviousBookings().subscribe((bookings) => {
      this.previousBookings$.next(bookings);
    });
  }
...

这是我尝试获取最新值的地方:

...
    const booking: Booking = this.asyncPipe.transform(
      this.bookingService.activeBooking$
    );

    booking.status = status; //error: booking is null
...


您在这里使用了一个初始值为 null 的 BehaviorSubject:

activeBookings$: Subject<Booking[]> = new BehaviorSubject<Booking[]>(null);

您可以用一个空数组来初始化它,例如:

activeBookings$: Subject<Booking[]> = new BehaviorSubject<Booking[]>([]);

否则你的真实类型是:

activeBookings$: Subject<Booking[] | null> = new BehaviorSubject<Booking[] | null>(null);

你为什么得到 null ? BehaviorSubject 需要用一个值初始化,这可能就是您获得的第一个值为 null 的原因。一个普通的 Subject 不需要包含一个初始值,你可能不会得到 null

activeBookings$: Subject<Booking[]> = new Subject<Booking[]>()

在不订阅其他服务的情况下获取最新值的一种更简洁的方法是利用 BehaviorSubject 的功能以及调用 activeBooking$.value 使您检索 BehaviorSubject 的最新值这一事实。转换您的 activeBooking$ 字段,使其成为一个 BehaviorSubject,当订阅 getActiveBookings() 的结果时,您可以执行当前在 activeBooking$ 定义管道中的计算,然后使用结果调用 activeBooking$ 的 next 并公开getter 用于您的其他服务:

get activeBooking(): Booking {
   return this.activeBooking$.value
}