我試圖擁有一個基于主題的可觀察物件,以便每次主題發出時都會更新它。
出于某種原因,當嘗試獲取 observable 的值時,第一個值始終為 null,其余包含值。我希望能檢索到 observable 的最新發射值。我已經嘗試過各種主題。我錯過了什么?
...
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
...
uj5u.com熱心網友回復:
您在此處使用初始值為 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 并公開您的其他服務的吸氣劑:
get activeBooking(): Booking {
return this.activeBooking$.value
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/446507.html
標籤:javascript 有角度的 rxjs 可观察的 主题
下一篇:使用時刻計算差異
