Rxjs 以递归方式等待订阅集完成

Rxjs 以递归方式等待订阅集完成,rxjs,rxjs6,Rxjs,Rxjs6,我有一个带有子对象的对象数组,需要在每个对象中递归地设置一个字段(隐藏)。每个的值都在订阅中设置。我想等到数组中的每个项都递归更新之后,订阅才能完成 隐藏字段将根据从另一个可观察对象派生的角色和权限进行设置。在这个例子中,我添加了一个延迟来模拟它 这是我第一次尝试。我相信有一个更干净的方法来解决这个问题 在代码沙盒示例中,查看控制台消息,我得到了正确的结果。然而,我想避免订阅setHidden和递归ethidden。如果可能,我也希望避免使用主题。以下是我的方法: constroleobser

我有一个带有子对象的对象数组,需要在每个对象中递归地设置一个字段(隐藏)。每个的值都在订阅中设置。我想等到数组中的每个项都递归更新之后,订阅才能完成

隐藏字段将根据从另一个可观察对象派生的角色和权限进行设置。在这个例子中,我添加了一个延迟来模拟它

这是我第一次尝试。我相信有一个更干净的方法来解决这个问题

在代码沙盒示例中,查看控制台消息,我得到了正确的结果。然而,我想避免订阅setHidden和递归ethidden。如果可能,我也希望避免使用主题。

以下是我的方法:

constroleobservable=timer(1000).pipe(映射到(“*************”));
函数populateWithField(o、field、fieldValue){
if(数组isArray(o)){
从(o)管道返回(
concatMap(c=>populateWithField(c,field,fieldValue)),
toArray()
);
}
如果(o.儿童){
返回角色observable.pipe(
点击(角色=>(字段值=角色)),
concatMap(role=>populateWithField(o.children,field,role)),
地图(儿童=>({
……哦,
[字段]:字段值,
儿童
}))
);
}
返回角色observable.pipe(
映射(角色=>({
[字段]:角色,
……哦
}))
);
}
(导航)
.pipe(concatMap(o=>populateWithField(o,“隐藏”))
.subscribe(console.log,e=>console.error(e.message));
要注意的主要问题是频繁使用。这意味着,除其他外,它将自动订阅/取消订阅其内部可观察对象

与其他操作符不同的是,
concatMap
保留了一个发射值的缓冲区,这意味着它将等待当前内部可观测值在订阅下一个之前完成

在这种情况下,您必须处理大量的可观察对象(
高阶可观察对象
),这就是每次遇到
子属性时必须使用
concatMap
的原因。该属性中的任何子级都可以有自己的
子级
属性,因此必须确保可观察对象只包含一阶可观察对象

您可以阅读更多关于高阶和一阶观测值的信息

以下是我的方法:

constroleobservable=timer(1000).pipe(映射到(“*************”));
函数populateWithField(o、field、fieldValue){
if(数组isArray(o)){
从(o)管道返回(
concatMap(c=>populateWithField(c,field,fieldValue)),
toArray()
);
}
如果(o.儿童){
返回角色observable.pipe(
点击(角色=>(字段值=角色)),
concatMap(role=>populateWithField(o.children,field,role)),
地图(儿童=>({
……哦,
[字段]:字段值,
儿童
}))
);
}
返回角色observable.pipe(
映射(角色=>({
[字段]:角色,
……哦
}))
);
}
(导航)
.pipe(concatMap(o=>populateWithField(o,“隐藏”))
.subscribe(console.log,e=>console.error(e.message));
要注意的主要问题是频繁使用。这意味着,除其他外,它将自动订阅/取消订阅其内部可观察对象

与其他操作符不同的是,
concatMap
保留了一个发射值的缓冲区,这意味着它将等待当前内部可观测值在订阅下一个之前完成

在这种情况下,您必须处理大量的可观察对象(
高阶可观察对象
),这就是每次遇到
子属性时必须使用
concatMap
的原因。该属性中的任何子级都可以有自己的
子级
属性,因此必须确保可观察对象只包含一阶可观察对象

您可以阅读更多关于高阶和一阶观测值的信息


谢谢。那有帮助!非常感谢。那有帮助!
// Array structure. Note children.
const navigation = [
  {
    id: "applications",
    title: "Applications",
    children: [
      {
        id: "dashboard",
        title: "Dashboard"
      },
      {
        id: "clients",
        title: "Clients"
      },
      {
        id: "documents",
        title: "Documents",
        children: [
          {
            id: "dashboard",
            title: "Dashboard"
          },...
        ]
      },
      {
        id: "reports",
        title: "Reports"
      },
      {
        id: "resources",
        title: "Resources"
      }
    ]
  }
];