Javascript *RxJs*如何将多个ajax组合成一个不需要';不需要顺序
我有两个API来获取Angular5上的菜单数据,但我不知道我是否使用嵌套订阅getSecondMenu函数是RxJs的正确方法。有人知道吗,以下是预期结果和示例代码:Javascript *RxJs*如何将多个ajax组合成一个不需要';不需要顺序,javascript,angular,rxjs,rxjs5,Javascript,Angular,Rxjs,Rxjs5,我有两个API来获取Angular5上的菜单数据,但我不知道我是否使用嵌套订阅getSecondMenu函数是RxJs的正确方法。有人知道吗,以下是预期结果和示例代码: console.log: 1.获取第一个菜单列表 2.全部完成 3.获取第二菜单*3 getFirstMenu$() .do(firstMenuList=>{ log('get firstMenuList'); }) .do(firstMenuList=>{ firstMenuList.forEach(firstMenu=
console.log:
1.获取第一个菜单列表
2.全部完成
3.获取第二菜单*3
getFirstMenu$()
.do(firstMenuList=>{
log('get firstMenuList');
})
.do(firstMenuList=>{
firstMenuList.forEach(firstMenu=>{
//嵌套订阅:绑定到子属性,让Angular自动生成HTML中的第二个菜单
getSecondMenu$(firstMenu.ID).subscribe((secondMenu)=>{
firstMenu.child=secondMenu;
log('get secondMenu');
});
})
})
.订阅((菜单列表)=>{
console.log(“全部完成”);
});
函数getFirstMenu$(){
返回Rx.observative.of([{
ID:'菜单1',
子项:空
}, {
ID:'menu2',
子项:空
}, {
ID:'菜单3',
子项:空
}, ]);
}
函数getSecondMenu$(menuID){
设source=null;
开关(menuID){
案例“menu1”:
来源=[{
ID:'子菜单1-1',
}];
打破
案例“menu2”:
来源=[{
ID:'子菜单2-1',
}];
打破
违约:
来源=[];
打破
}
const delayTime=((Math.random()*20)+5)*120;
返回(源)的可观测Rx.延迟(延迟时间);
}
试试这个
getFirstMenu$()
.map(firstMenuList => Observable.from(firstMenuList))
.flatMap(firstMenu=> getSecondMenu$(firstMenu.ID))
.do(secondMenu => firstMenu.child = secondMenu)
.subcribe()
编辑1
getFirstMenu$()
.mergeMap(firstMenuList => Rx.Observable.from(firstMenuList))
.mergeMap(firstMenu=> getSecondMenu$(firstMenu.ID)
,(firstMenu, secondMenu) => {
firstMenu.child=secondMenu
return firstMenu
})
.reduce((acc,curr)=> acc.concat(curr) ,[])
.subscribe((menuList) => {
console.log(menuList)
});
在这个示例中,我不知道如何获取菜单列表数据,我尝试了一下,你能帮我纠正一下吗?你可以模拟一个像getFirstMenu$=()=>Observable.of([{lable:'one'},{lable:'two'}]),并在Fiddle中使用它,我已经使用了Observable.of在jsFiddle中,你可以在这个链接上检查它并更新你的Fiddle谢谢你的回答,我在预期结果中添加了一个时间线,希望我的问题能简单一些,你能检查一下这个和这个ForEach。订阅看起来是一个获得内存泄漏的可靠方法。。即使没有嵌套的第二个call@c69有什么好方法可以避免内存泄漏?使用平面图?