如何将对象或任何类型从Observable转换为将对象数组返回到对象数组..?

时间:2019-07-18 03:34:27

标签: javascript typescript spring-boot angular8

我需要操纵一个数组来获取我想要的数据,流程是,后端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

2 个答案:

答案 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);
  });