Angular 2 Observable to Observable []

时间:2017-01-28 15:36:25

标签: angular typescript rxjs

不确定标题是否准确,因为不确定术语。

假设我有一些类似下面的代码。

当我使用第一种方法加载单个资源时,我可以创建一个富模型类的实例,它在传递给map(...)的函数中包装/修饰普通的JS对象。

如何在第二种方法中实现相同的方法,其中响应是一个Course对象数组?

@Injectable()
export class CourseService {

  constructor(private restangular: Restangular) {

  }

  public getCourse(id: number): Observable<any> {
    return this.restangular.one("courses", id).get().map(response =>
      new Course(response)
    );
  }

  public getAllCourses(): Observable<any> {
    return this.restangular.all("courses").getList().map(response => {
      //an array of courses
      console.log(response);
    });
  }
}

3 个答案:

答案 0 :(得分:2)

由于第二个方法接收数组,您可以使用Array.map()迭代数组的值并将每个值转换为Course实例:

public getAllCourses(): Observable<any> {
  return this.restangular.all("courses").getList().map(response => {
    return response.map(courseData => new Course(courseData));
  });
}

此代码可能会引起混淆,因为:

为简洁起见,您可以在一行上编写方法体(从而避免使用内部return):

public getAllCourses(): Observable<any> {
  return this.restangular.all("courses").getList().map(response => response.map(courseData => new Course(courseData)));
}

但是阅读起来有点困难。 :)

答案 1 :(得分:0)

您对此方法有何看法?

@Injectable()
export class CourseService {

  constructor(private restangular: Restangular) {

  }

  public getCourse(id: number): Observable<any> {
    return this.restangular.one("courses", id).get().map(response =>
      new Course(response)
    );
  }

  public getAllCourses(): Observable<any> {
    return this.restangular.all("courses").getList().map(response => {
      //an array of courses
      let courses = [];
      for (let courseData of response) {
        courses.push(new Course(courseData);
      }
      return courses;
    });
  }
}

这适合您的问题吗?

答案 2 :(得分:-1)

您只需使用

即可
public getAllCourses(): Observable<Course[]> {
    return this.restangular.all("courses").getList().map((resp: Response) => resp.json());
}