RXJS избегает вложенных множественных подписок

Я хотел бы преобразовать приведенный ниже фрагмент кода:

 this.dataUserSubscription = this.store$.pipe(select(selectUser)).subscribe(
            user => {
                this.store$.pipe(select(selectUserData, {user}), take(1))
                    .subscribe(userData => {
                        if (userData === null) {
                            this.store$.pipe(select(selectUserManagement, {user}), take(1)).subscribe(
                                userManagement => {
                                    this.store$.dispatch(saveUserDataToStore({
                                        user,
                                        userManagement
                                    }));
                                });
                        }
                    });

избегая вложенной подписки. Все примеры, которые я нашел, рассчитаны на две подписки.

 this.dataUserSubscription = this.store$.pipe(select(selectUser),
    switchMap(user => this.store$.pipe(select(selectUserData, {user}))))
    .subscription(userData => {
        // logic
    })

Но для моего примера кода это неправильное решение. Почему это правильный шаг для исправления нескольких вложенных подписок?

1 ответ

Согласно лучшим практикам RxJS, ваш второй пример - вполне приемлемый подход.

Но согласно лучшим практикам NgRx вы можете избавиться от вложенной подписки, просто объединив свои селекторы.

Трудно сказать, что делать, не видя своегоselector файлы, но если у вас уже есть user в магазине, тогда вы сможете вытащить данные пользователя из магазина без двух вызовов селектора.

Может что-то вроде:

const getDataForUser = createSelector(
    selectUser,
    selectUsers,
    (user, userDataDictionary) => userDataDictionary[user.id]
)

Тогда просто используйте тот getDataForUser селектор.

Другие вопросы по тегам