public getAny(newParams: any): Subject<IRoomCard[]> {
let params: any = this.generateQueryParams(newParams);
// Поток
const stream: Subject<IRoomCard[]> = new Subject();
this.http.get(`/api/v1/p1`, {params: params})
.subscribe(( res: IGetSearchId ) => {
params.search_id = res.search_id;
this.http.get(`/api/v1/p2`, {params: params})
.subscribe(( res: IPrepeareRequest ) => {
try{
stream.next(res.search_result[0].rooms);
} catch(err){
stream.next([]);
}
});
});
return stream;
}
// поправил реализацию
public getAny(newParams: any): Observable<IRoomCard[]> {
let params: any = this.generateQueryParams(newParams);
return this.http.get(`/api/v1/p1`, {params: params})
.mergeMap(( res: IGetSearchId ) => {
params.search_id = res.search_id;
return this.http.get(`/api/v1/p2`, {params: params})
.map(( res: IPrepeareRequest ) => {
try{
return res.search_result[0].rooms;
} catch(err){
return [];
}
});
});
}
export class TabNumberComponent implements OnInit, OnDestroy {
constructor(
private service: MyService,
) { }
// Форма только инициализируется через сервис. Вносить изменения в сервис она не должна
ngOnInit() {
this.getListRooms();
}
ngOnDestroy() {
// Отписываемся от подписок
this.subscriptions.forEach(s => s.unsubscribe() );
}
// Получаем список комнат
public getListRooms(): void {
// Если уже идет отправка формы или форма не валидна
if(this.isLoading || !this.form.valid){
return;
}
this.isLoading = true;
let SRooms = this.service.getAny(this.params).subscribe((rooms: IRoomCard[]) => {
this.rooms = rooms;
});
this.subscriptions.push(SRooms);
}
}
getListRooms() вызывается при ините, далее по кнопке, т.е. постоянно создается новый поток. Это влияет на производительность? (старые потоки никогда более не вызовутся, но по идее они должны съедать память раз они существуют). Их надо глушить оператором take чтоб освободить память? Нужна ли отписка холодных потоков при destroy если их не глушить?