在我的服务类中,我正在循环一个http get请求,并使用rxjs forkJoin将所有响应组合到一个observable中,并将其返回给我的组件。对于每个返回的响应,我需要向json添加两个属性(readySystem是一个对象,serviceType是一个字符串)。每个循环的迭代值都是不同的。角度循环HTTP请求映射值到响应
我该如何保存/存储/保留和and/map值并将它们添加到正确的响应中?
以我试图在下面做的方式,两者的值在最终可观察值中返回的每个响应中都是相同的。
getServices() {
for (var x = 0; x < this.service.items.length; x++){
var num = Object.keys(this.service.items[x].links).length;
for (var key in this.service.items[x].links) {
var systemName = this.service.items[x].systemName;
var environment = this.service.items[x].environment;
var server = this.service.items[x].server;
var port = this.service.items[x].port;
var linkName = this.service.items[x].links[key];
var serviceType = key;
this.observables.push(
this.http.get('http://localhost:3000/myapi/get/service?server=' + server + '&service=' + linkName)
.map((res:Response) => {
var output = res.json()
for (var obj in output) {
if (output.hasOwnProperty(obj)){
var readySystem = new System(systemName,
environment,
server,
port,
linkName);
output[obj].System = readySystem;
output[obj].serviceType = serviceType;
}
}
return output;
})
);
}
};
return Observable.forkJoin(this.observables);
};
更新:随着下面的答案提供建议的代码更改,我得到的输出,如:
0: Array(33)
1: System
systemName: "my system"
environment: "my environment"
etc.
2: "myservice"
3: Array(35)
4: System
etc.
5: "myotherservice"
但是,我们需要的是:
0: Array(33)
0: Object
> System
systemName: "my system"
environment: "my environment"
etc.
serviceType: "myservice"
1: Object
> System
systemName: "my system"
environment: "my environment"
etc.
serviceType: "myotherservice"
etc.
1: Array(35)
0: Object
谢谢。我明白这个函数在做什么,但是{ready:true}的目的是什么,我应该在什么时候和从哪里调用这个函数呢? – HendPro12
在一个循环中,你创建了一个可观察对象的数组,这个对象将执行http调用,正如我所理解的,你为每个forkJoin - readySystem和serviceType创建了两个变量。因此,您只需使用Observable.of将它们添加到可观察数组中,并执行与现在一样的返回。 –
我的forkJoin发生在我的内部和外部循环外的return语句中。我相信我需要将内部循环中的两个变量添加到每个单独的observables中,然后将它们推入到我的observable数组中。 – HendPro12