【问题标题】:RXJS avoid nested multiple subscriptionsRXJS 避免嵌套多个订阅
【发布时间】:2020-08-18 17:54:05
【问题描述】:

我想转换下面的代码sn-p:

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

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

【问题讨论】:

  • 您在这里的多重订阅的用例是什么?根据您可以选择您的 rxjs 运营商。
  • @Tal Ohana 不。没有相关订阅。我需要第二次和最后一次订阅的数据。
  • @GaurangDhorda 我需要调度操作,并且它需要一些不同的数据。但是,当在下拉菜单中更改选择用户时,也应该重新加载这些选择器。这就是为什么我需要嵌套订阅 - aut。刷新。

标签: angular typescript rxjs rxjs-subscriptions


【解决方案1】:

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

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

如果没有看到您的 selector 文件,很难确切地说 要做什么,但如果您已经在商店中拥有 user,那么您应该能够提取用户数据没有 2 个选择器调用的商店。

可能是这样的:

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

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

【讨论】:

  • 感谢您的回复。但是我需要纯 rxjs 中的解决方案,没有双选择器等。我应该使用多个 switchMap 还是什么?我尝试了混合解决方案,但没有成功。
猜你喜欢
  • 2020-05-31
  • 2019-10-03
  • 2023-01-11
  • 2023-01-30
  • 2019-08-20
  • 2022-06-22
  • 2018-11-27
  • 2022-08-25
  • 1970-01-01
相关资源
最近更新 更多