我需要操纵一个数组来获取我想要的数据,流程是,后端java返回一个对象数组,angular获取数据并作为可观察到的服务返回。然后订阅可观察的方法并遍历数据。
我有一个与java对象中的接口相同的接口结构,它遍历数据并将值推入该接口类型的空数组。
这里的问题是数据记录提供了正确的数组输出,但是当我对数据使用任何数组方法时,它显示为未定义。
this.service.getByd(d).subscribe(dataList => {
for (let key in dataList) {
if (dataList.hasOwnProperty(key)) {
this.event.push(dataList[key]);
}
}
},
err => {
console.log(err);
});
console.log(event) //expected output
console.log(event[0].eventType) //undefined
答案 0 :(得分:0)
您应该在console.log()
块中编写subscribe()
语句,因为HTTP请求是异步的。
因此,您编写的初始代码块将失败,因为此时event
是不确定的。为了进一步理解这一点,您应该阅读JavaScript的event loop。
此外,我相信您的意思是this.event
,而不是event
。
this.service.getByd(d).subscribe(dataList => {
for (let key in dataList) {
if (dataList.hasOwnProperty(key)) {
this.event.push(dataList[key]);
}
}
console.log(this.event)
console.log(this.event[0].eventType)
},
err => {
console.log(err);
});
答案 1 :(得分:0)
您看到的是未定义状态,因为代码不会逐行执行:
dataList: DataList[] = new Array<DataList>();
function GetDataList(){
this.service.getByd(d).subscribe(dataList => {
... //populate array
},
err => {
console.log(err);
});
console.log(event) //This works because you are creating it before the get request
console.log(event[0].eventType) //This will get called before the subscribe finishes
}
我对它的工作方式做了一些记录。
此外,如果“接口”是后端的镜像,则无需遍历该接口;只需这样做:
this.service.getByd(d).subscribe(dataList => {
dataList = dataList;
console.log(dataList[0].eventType;
}
},
err => {
console.log(err);
});