在我的服务类中,我正在循环一个 http get 请求并使用 rxjs forkJoin 将所有响应组合到一个可观察到的对象中,然后返回到我的组件。对于返回的每个响应,我需要向 json 添加两个属性(readySystem 是一个对象,serviceType 是一个字符串)。对于循环的每次迭代,其中每一个的值都不同。
如何保留/存储/保留 和 的值并将它们映射/添加到正确的响应?
按照我在下面尝试执行的方式,在最终可观察对象中返回的每个响应中,两者的值都是相同的。
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
最佳答案
只需使用 Observable.of 将这些值添加到 fork
function getObsevrables(observables, readySystem, serviceType) {
return Rx.Observable.forkJoin([
Rx.Observable.of(readySystem),
Rx.Observable.of(serviceType),
...observables
]);
}
getObsevrables([Rx.Observable.of(1), Rx.Observable.of(2)],
{ready: true}, 'type1')
.subscribe(x=>console.log(x))
更新:
我尝试更新您的代码。
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;
var readySystem = new System(systemName,
environment,
server,
port,
linkName);
// getObservables([Observable.of(1), Observable.of(2)], readySystem, serviceType).subscribe(x => console.log(x));
this.observables.push(
Observable.combineLatest(
this.http.get('http://localhost:3000/myapi/get/service?server=' + server + '&service=' + linkName)
.map((res: Response) => {
var output = res.json();
return output;
});
},
Observable.of(serviceType),
Observable.of(readySystem)
)
);
}
}
关于Angular Looped HTTP 请求将值映射到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44200851/