angular - withLatestFrom operatörü null değerde tetiklenmez
Bir Angular projesinde @ngrx/effect kullanırken, withLatestFrom rxjs operatörünü kullanan bir observable akışımız var.
İşte gözlemlenebilir etki akışımız:
@Effect()
handleUsersData$ = this.actions$
.pipe(
ofType(HANDLE_USER_DATA),
withLatestFrom(
this.store.pipe(select(getCurrentUserId)),
this.store.pipe(select(getUserEntities)),
),
tap(([action, currentUserId, users]) => console.log(([action, currentUserId, users]))),
switchMap(([action, currentUserId, users]) => {
const dispatchedActions: Action[] = [];
if (currentUserId) {
dispatchedActions.push(new SetCurrentUser());
} else {
dispatchedActions.push(new SomeAction());
dispatchedActions.push(new ClearUsers());
}
return dispatchedActions;
})
);
Kullandığımız seçimcilerden biri aşağıdaki gibidir:
export const getCurrentUserId = createSelector(
getUserEntities,
getRouterStateUrl,
(users: Dictionary<User>, router: RouterStateUrl) => {
return router.params && users[router.params.userId] || null;
}
);
userId tanımlandığında, işlemler düzgün bir şekilde gönderilir. console.log kullanıcı kimliğini ve kullanıcı varlıklarını gösterir.
Ancak userId router parametreleri arasında değilse, seçici null döndürür ve gözlemlenebilir akış asla tetiklenmez. tap içindeki console.log hiçbir şey döndürmez.
withLatestFrom neden null değerini görmezden geliyor gibi görünüyor ve eğer bu değer seçicinin sonucuysa hiç tick atmıyor? Bizim bağlamımızda geçerli bir değer.
getCurrentUserId seçicisinde null değer olsa bile gözlemlenebilir akışın nasıl tıklamaya devam edeceğini nasıl sağlarsınız?
Cevap #1
Görünüşe göre bunun yerine combineLatest kullanmak istiyorsunuz.
withLatestFrom null değerini göz ardı etmez. Bu, normal bir değerdir. Ancak, withLatestFrom yalnızca doğrudan kaynağından gelen yayınlara tepki verir. Bu, this.actions$.pipe(ofType(HANDLE_USER_DATA)) kaynaklıdır. Diğer kaynaklardan gelen yayınları da saklar ama bunları yalnızca dahili tamponunda tutar ve onlara tepki vermez.
Öte yandan combineLatest, tüm kaynak Observable'lar en az bir öğe yaydıktan sonra her yayımı için yayın yapacaktır (tüm kaynakların en az bir kez yayın yapmasını sağlamak istiyorsanız startWith'e bakın).