我在Angular4应用程序中创建了这个函数:
enrollmentCheck() {
this.allCourses.forEach(course => {
this._courses.getCurrentEnrolment(course.slug).subscribe(res => {
if(res.length > 0){
this.enrolledCourses.push(res[0].course_id);
console.log(this.enrolledCourses);
}
})
});
console.log(this.enrolledCourses);
}
它应该遍历一个对象数组并检查用户是否已注册到其中任何一个。
第一位效果很好,订阅给了我正确的数据(res)。然后我需要将属性course_id存储到数组中。
第一个日志(在循环内)似乎工作正常。我得到了
[1]
[1,2]
[1,2,5]
[1,2,5,7]
作为输出,每次循环执行一次。
问题是第二个日志(在循环之外)会输出如下内容:
[
0: 1
1: 2
2: 5
3: 7
]
而不是
[1,2,5,7]
正如我想的那样,因为我需要遍历这个数组,而我找不到用我得到的方法来做到这一点。
有人可以帮忙吗?如果这对某人来说似乎是一个愚蠢的问题,我会道歉,但任何帮助都会非常感激。
谢谢, M.
答案 0 :(得分:0)
您的方法存在一些问题。首先,你在循环中创建订阅,这是一个坏主意,因为你永远不会完成它们。其次你在循环中进行asyc操作,因此在第二个控制台日志出现时,数据可能还没有。
更好的解决方案是使用Observable.forkJoin
等待所有异步请求,然后映射数据。
例如
enrollmentCheck() {
Observable.forkJoin(
this.allCourses.map(course => {
return this._courses.getCurrentEnrollment(course.slug);
}
).map(res => {
return res
.filter(enrollment => enrollment.length > 0)
.map(enrollment => enrollment[0].course_id)
}).subscribe(data => console.log(data))
}