Подписка на наблюдаемые

У меня есть приложение Angular, где я извлекаю данные из API с помощью HttpClient.

Я хотел бы получить необработанные данные из API и отправить их в соответствующую службу. У служб есть методы, которые отображают необработанные данные для моделирования объектов и возвращают их компоненту.

Проблема в том, что я получаю данные из API (return Observable), я подписываюсь в методе службы, а затем я делаю не знаю, как передать данные компоненту.

Служба Api, где я извлекаю данные из API. Затем я отправляю необработанные данные и услуги отеля, где я хочу отображать необработанные данные для моделирования и отправки в компонент

@Injectable()
export class ApiService {
  ...
  public getHotelById(hotelId: number): Observable<any> {
      return this.http
          .get(API_URL + '/hotel/' + hotelId)
          .map((response) => {
              return response;
          })
  }
  ...
}


@Injectable()
export class HotelService {
  ...
  public getHotelById(id: number): Subscription {
    return this.api.getHotelById(id).subscribe(
        (response) => {
            let hotel = new HotelModel(response.hotel);

            hotel.mapCountry(response.country);

            return hotel;
        }
    );
  }
  ...
}

Может ли кто-нибудь помочь мне получить данные из службы в компоненте? Я получаю ошибку, что объект, который возвращает сервисный сервис, является подпиской, и я не могу подписаться на него.

Есть ли способ, как это сделать? Я не хочу делать какую-либо бизнес-логику в службе API. На этом месте я просто хочу получить данные.

Служба Api, где я извлекаю данные из API. Затем я отправляю необработанные данные и гостиничный сервис, где я хочу отображать необработанные данные для моделирования и отправки в компонент

  ngOnInit() {
    this.activatedRoute.queryParamMap.subscribe(
        (map) => {
            this.hotelId = this.activatedRoute.snapshot.params['id'];

            this.hotel = this.hotelService.getHotelById(this.hotelId)
                .subscribe(
                (hotel) => {
                  this.hotel = hotel;
                }
            )
        }
    )
  }
0
задан 13 August 2018 в 15:16

2 ответа

Я думаю, что хороший способ для вас - сопоставить свой результат с конкретной функцией «getHotelById» (вы делаете ORM как)

@Injectable()
export class ApiService {
  ...
  public getHotelById(hotelId: number): Observable<any> {
      return this.http
          .get(API_URL + '/hotel/' + hotelId)
          .map((response) => {
            let hotel = new HotelModel(response.hotel);

            hotel.mapCountry(response.country);

            return hotel;
          })
  }
  ...
}


@Injectable()
export class HotelService {
  ...
  public getHotelById(id: number): Observable<any> {
    return this.api.getHotelById(id);
  }
  ...
}

И в вашем компоненте ничего не меняется.

0
ответ дан 15 August 2018 в 17:01

Вам действительно нужны две службы?

@Injectable()
export class HotelService extends AbstractHttpService {

  constructor (
    private httpClient: HttpClient,
  ) {
    super();
  }

  loadHotels(): Observable<Hotel[]> {
    const url = this.url('hotels');

    return this.httpClient.get<Hotel[]>(url, this.standardHttpOptions);
  }
}

В абстрактном классе есть некоторые помощники для запроса целевого URL-адреса и предоставляет стандартные параметры http для вызова get.

0
ответ дан 15 August 2018 в 17:01

Другие вопросы по тегам:

Похожие вопросы: