数组数组转换为键值对数组;

时间:2017-10-12 16:54:21

标签: javascript arrays angular observable subscribe

我在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.

1 个答案:

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