[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: angular 2 + rxjs + http-запросы
Invis1ble
Изучаю angular 2 и застрял. В гайде написано:
Цитата (https://angular.io/docs/ts/latest/guide/server-communication.html)
While promises may be more familiar, observables have many advantages. Don't rush to promises until you give observables a chance.

В ParentService::getParents() идёт запрос к API, оттуда возвращается json вида:
{
entities: [
{ name: 'parent1', childrenUrl: '/api/parents/parent1/children' },
{ name: 'parent2', childrenUrl: '/api/parents/parent2/children' },
....
]

}

Как правильно с использованием RxJS-Observable пройтись по каждому элементу и сделать запрос по childrenUrl? В .extractData() как-то засунуть эту обработку? Что-то типа response.json().entities.forEach(entity => { this.childService.getChildren(entity.childrenUrl) }) А что возвращать? Короче я застрял в этих RxJS-операторах.

parent.model.ts


import { ChildModel } from './child.model';

export class ParentModel {
name: string;
children: ChildModel[];
}


parent.service.ts

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';

import { ChildService } from './child.service';
import { ParentModel } from './parent.model';

@Injectable()
export class ParentService {
private parentsUrl = '/api/parents.json';

constructor(
private http: Http,
private childService: ChildService
) {

}


getParents(): Observable<ParentModel[]> {
return this.http.get(this.parentsUrl)
.
map(this.extractData)
.
catch(this.handleError);
}

private extractData(response: Response) {
return response.json().entities;
}

private handleError(error: any) {
// ...
}
}


child.model.ts

export class ChildModel {
name: string;
}


child.service.ts

import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';

import { ChildModel } from './child.model';

@Injectable()
export class ChildService {
constructor(private http: Http) {

}


getChildren(childrenUrl): Observable<ChildModel[]> {
return this.http.get(childrenUrl)
.
map(this.extractData)
.
catch(this.handleError);
}

private extractData(response: Response) {
return response.json().entities;
}

private handleError(error: any) {
// ...
}
}


_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.