javascript - 从 3 个对象数组创建对象数组
问题描述
我在返回对象数组的角度组件中有 3 个私有方法。
我需要创建一个包含所有 3 个对象的数组。它们都具有相同的类
就这个
export class TimelineItemDto {
id: any;
creatorAvatarUrl: string;
categoryName: string;
creatorName: string;
subcategoryName: string;
description: string;
type: string;
}
这是组件的代码
export class HomeComponent implements OnInit {
constructor(private _router: Router, private http: HttpClient) { }
color: ThemePalette = 'primary';
classes: TimelineItemDto[] = [];
requests: TimelineItemDto[] = [];
courses: TimelineItemDto[] = [];
timelineItems: TimelineItemDto[] = [];
checked = false;
disabled = false;
ngOnInit(): void {
const token = localStorage.getItem('jwt');
if (!token) {
this._router.navigate(['/main/login']);
}
this.getTimelineItems();
}
getCourses(): any {
return this.http
.get(environment.baseUrl + '/Course/GetCourses')
.subscribe((data: TimelineItemDto[]) => {
return data;
});
}
getClasses(): any {
return this.http
.get(environment.baseUrl + '/Class/GetClasses')
.subscribe((data: TimelineItemDto[]) => {
return data;
});
}
getRequest(): any {
return this.http
.get(environment.baseUrl + '/Requests/GetRequests')
.subscribe((data: TimelineItemDto[]) => {
return data;
});
}
getTimelineItems(): any {
var courses = this.getCourses();
var classes = this.getClasses();
var requests = this.getRequest();
this.timelineItems = [...classes, ...courses, ...requests];
console.log(this.timelineItems);
}
}
在这一行this.timelineItems = [...classes, ...courses, ...requests];
我有这个错误
core.js:4197 错误类型错误:类不可迭代
我该如何解决这个问题?
解决方案
问题
考虑下面的代码
getCourses(): any {
return this.http
.get(environment.baseUrl + '/Course/GetCourses')
.subscribe((data: TimelineItemDto[]) => {
return data;
});
}
上面的代码调用.get()
方法然后调用.subscription()
方法。这表明此方法实际上返回一个订阅,而不是一个Observable
. 由于错误表明您正在尝试迭代这些订阅,因此出现错误
解决方案
为了解决这个问题,有多种方法,我的方法如下
- 获取类为
Observable
- 获取请求为
Observable
- 获得课程
Observable
- 将这三者
Observables
合二为一Observable
- 订阅新的
Observable
请参阅下面的代码
constructor(private _router: Router, private http: HttpClient) {}
color: ThemePalette = "primary";
timelineItems: TimelineItemDto[] = []
getCourses = () =>
this.http.get<TimelineItemDto[]>(
environment.baseUrl + "/Course/GetCourses"
);
getClasses = () =>
this.http.get<TimelineItemDto[]>(environment.baseUrl + "/Class/GetClasses");
getRequest = () =>
this.http.get<TimelineItemDto[]>(
environment.baseUrl + "/Requests/GetRequests"
);
classes$: Observable<TimelineItemDto[]> = this.getClasses();
requests$: Observable<TimelineItemDto[]> = this.getRequest();
courses$: Observable<TimelineItemDto[]> = this.getCourses();
timelineItems$: Observable<TimelineItemDto[]> = combineLatest([
this.classes$,
this.courses$,
this.requests$
]).pipe(
map(([classes, courses, requests]) => [...classes, ...courses, ...requests])
);
checked = false;
disabled = false;
ngOnInit(): void {
const token = localStorage.getItem("jwt");
if (!token) {
this._router.navigate(["/main/login"]);
}
this.getTimelineItems();
}
getTimelineItems(): any {
this.timelineItems$.subscribe({
next: (items) => this.timelineItems = items
})
}
推荐阅读
- python - 再次调用函数时对列表的更改保持不变(不需要)
- c# - Convert.ChangeType 不接受 Decimal 的“1E-5”科学记数法,如何解决?
- makefile - GNU MakeFile 包括另一个带有 eval 函数的 makefile 简单问题
- r - R:ties.method = random:使用 ties.method = random 排名时如何始终获得相同的随机化
- c# - 如何在 ASP.NET Core 2.1 上的另一个 API 中调用 API
- princexml - 如何使用 PrinceXML 将 div 对齐到 PDF 中页面的底部
- powershell - 通过 Powershell 处理来自 SOAP 请求的错误代码
- javascript - 如何让我的元素占据全屏并禁用滚动?
- python - 等待用户关闭一个 plt 图形,然后在 Python 中打开下一个图形
- cython - 从 Cython 中的自定义 C++ 库中键入?