Javascript 递归http api调用后的消息订阅服务器
我想获取一个节点列表,以创建所述节点对象的数组,以便显示层次结构。基于的数据/结构如下所示:Javascript 递归http api调用后的消息订阅服务器,javascript,angular,recursion,Javascript,Angular,Recursion,我想获取一个节点列表,以创建所述节点对象的数组,以便显示层次结构。基于的数据/结构如下所示: ROOT (ID=1) |--NODE (ID=2) | └--NODE (ID=4) | └--NODE (ID=11) └--NODE (ID=3) |--NODE (ID=5) |--NODE (ID=6) |--NODE (ID=7) └--NODE (ID=8) |--NODE (ID=9) └--NODE (ID=10) 您有一
ROOT (ID=1)
|--NODE (ID=2)
| └--NODE (ID=4)
| └--NODE (ID=11)
└--NODE (ID=3)
|--NODE (ID=5)
|--NODE (ID=6)
|--NODE (ID=7)
└--NODE (ID=8)
|--NODE (ID=9)
└--NODE (ID=10)
您有一个根节点,其子节点也包含child。包括根节点在内,树中有3个阶段。我创建了一个REST-API,它返回给定节点内的子节点。我还尝试在REST结构中对该层次结构进行建模,因此调用如下所示:
TYPE PATH RESULT CHILD IDs
GET /1/nodes 2, 3
GET /1/nodes/2/nodes 4
GET /1/nodes/3/nodes 5, 6, 7, 8
GET /1/nodes/3/nodes/8/nodes 9, 10
this.subject.next(this.getNodes('/1/nodes'); /*root-uri*/
getNodes(uri) {
const nodeList: Node[] = [];
http.get(path).subscribe(data => {
for(const obj of data.json()) {
let node = new Node();
//map data to Node e.g node.is = data.id
//get the children with the nested call
node.children = getNodes(uri + '/' + node.id + '/nodes');
nodeList.push(node);
}
}
return nodeList;
}
为了构建树,我尝试使用递归模式,如下所示:
TYPE PATH RESULT CHILD IDs
GET /1/nodes 2, 3
GET /1/nodes/2/nodes 4
GET /1/nodes/3/nodes 5, 6, 7, 8
GET /1/nodes/3/nodes/8/nodes 9, 10
this.subject.next(this.getNodes('/1/nodes'); /*root-uri*/
getNodes(uri) {
const nodeList: Node[] = [];
http.get(path).subscribe(data => {
for(const obj of data.json()) {
let node = new Node();
//map data to Node e.g node.is = data.id
//get the children with the nested call
node.children = getNodes(uri + '/' + node.id + '/nodes');
nodeList.push(node);
}
}
return nodeList;
}
所以我的问题是:如何从递归http调用创建节点对象数组,并向订阅者发送消息,以便订阅者只接收正确结构的完整节点数组
编辑 这就是节点模型的外观
export class Node {
uuid: string;
label: string;
parentID: string;
version: number;
addableFlag: boolean;
sectionFlag: boolean;
children: Node[];
}
您需要在
subscribe()
范围中设置this.subject
值。这样,在设置值之前,它就有了一个完整的、结构正确的列表
this.getChildren('/1/nodes')/*根uri*/
getNodes(uri){
常量节点列表:节点[]=[];
http.get(path).subscribe(数据=>{
for(data.json()的const obj){
让节点=新节点();
//将数据映射到节点,例如Node.is=data.id
//使用嵌套调用获取子对象
node.children=getNodes(uri+'/'+node.id+'/nodes');
nodeList.push(节点);
}
this.subject.next(nodeList);/*根uri*/
}
//Return将在数据到达之前执行此行时发送空数据
//返回节点列表;
}
您正在以同步方式返回nodeList,这将不起作用。@Salketer您能给我一个示例,说明如何以正确的方式返回吗?如何将子节点添加到子数组中?行node.children=getNodes(uri)
de无法工作,因为node.children正在接受节点数组,但该方法不返回任何内容。