2017-01-28 162 views
0

不確定標題是否準確,因爲不確定確切的術語。Angular 2 Observable to Observable []

假設我有一些如下所示的代碼。

當我使用第一種方法加載單個資源時,我可以創建一個豐富模型類的實例,它在傳遞給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); 
    }); 
    } 
} 

回答

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))); 
} 

但它是稍硬閱讀。 :)

+0

這是優秀的! –

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; 
    }); 
    } 
} 

這是否適合您的問題?

-1

你可以簡單地做它用

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