0

我想转换下面的代码片段:

 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
    })

但这不是我的代码示例的正确解决方案。为什么修复多个嵌套订阅是正确的步骤?

4

1 回答 1

1

根据 RxJS 最佳实践,您的第二个示例是一种完全可以接受的方法。

但是根据 NgRx 最佳实践,您可以通过组合选择器来摆脱嵌套订阅。

如果没有看到您的文件,很难确切地说出该怎么selector,但是如果您已经user在商店中拥有了,那么您应该能够在没有 2 次选择器调用的情况下将用户数据从商店中提取出来。

也许是这样的:

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

然后只需使用一个getDataForUser选择器。

于 2020-05-04T13:48:55.247 回答