【发布时间】:2020-08-20 10:00:31
【问题描述】:
我有一个组件,它在初始化时从 api 检索学生信息。 这是我的 cmponent-version1
上的 onIniti 代码ngOnInit(): void {
if(!this.student) {
this.studentsService.getStudentDetail(this.id).subscribe(
(response: Student) => {
this.student = response;
},
error => console.log(error)
)
}
}
这是我的student-service-version1
里面的函数getStudentDetail(id: number): Observable<Student> {
return this.httpClient.get<Student>(`${this.studentsUrl}${id}/`, this.baseService.httpOptions);
}
一切正常。现在,仅出于教学目的(我是 javascript/typescript 的新手),我想重构我的服务以使用单个 get 函数,该函数在不带参数调用时返回学生列表,而是在使用特定 ID 调用时返回学生详细信息。 这是students-service-version2
getStudents(id?: number): Observable<Student[]> {
if(id)
return this.httpClient.get<Student[]>(`${this.studentsUrl}${id}/`, this.baseService.httpOptions);
else
return this.httpClient.get<Student[]>(this.studentsUrl, this.baseService.httpOptions);
}
鉴于我的函数的签名声明它返回一个可观察的学生数组,在我的组件中,我需要一种从 Student[] 到 Student 的类型转换。我就是这样做的: 组件版本2
ngOnInit(): void {
if(!this.student) {
this.studentsService.getStudents(this.id).subscribe(
(response: Student[]) => {
this.student = response[0] as Student;
},
error => console.log(error)
)
}
}
这不起作用,所以在初始化之后,student var 保持未定义。我不明白为什么,一切对我来说似乎都是正确的(尽管这种重构不是一个好主意。同样,我只是想了解背后的错误)
我也试试
this.student = response.pop() as Student; 同样的结果,不工作。
【问题讨论】:
-
response长什么样子? -
你在哪里检查学生变量?因为您的分配
student = response[0]在订阅中,这是异步的 -
使用调试器。在 onInit() 之后使用版本 #1,学生没问题,使用版本 #2 会导致未定义
-
@brk console.log(response) 打印:{id: 18, cf: "ciaciacia", first_name: "Paolo", last_name: "Bianchi", date_of_birth: "2020-05-01 ", ...} 果然是学生信息
标签: javascript arrays angular typescript observable