Это мой служебный код для получения массива результатов:

  getIndustries(): Observable<any> {
    return this.http.get(`${IndustriesService.BASE_URI}/?searchTerm=`)
                    .map((res: Response) => res.json())
                    .catch((err: any) => Observable.throw('Server Error'));
  }

Ниже приведен конструктор моих компонентов и метод связи с указанной выше службой.

  protected searchData: Array<Industry>;
  constructor( private completerService: CompleterService,
               private route: ActivatedRoute,
               private industriesService: IndustriesService) { 
      this.fetchIndustryCodes();
    }

  private fetchIndustryCodes(): Subscription {
    return this.route.params
      .switchMap((industries: Industry[]) => this.industriesService.getIndustries())
      .subscribe((industries_data: Industry[]) => {
        this.searchData = industries_data
      });
  }

Когда я пытаюсь распечатать этот searchData в конструкторе, он печатает объект подписки. Я не знаю, как получить данные через вышеупомянутую подписку.

Любое направление в этом вопросе было бы большим подспорьем!

0
Ajay 12 Июн 2017 в 17:06
Похоже, что вы также должны отправлять свой поисковый запрос в качестве параметра url, но при этом вы никогда не заполняете его "? searchTerm =" ... вам нужно поместить туда переменную поискового запроса.
 – 
ganders
12 Июн 2017 в 19:09
Кроме того, планируете ли вы проглатывать любые ошибки, возвращаемые вашим обращением в службу поддержки?
 – 
ganders
12 Июн 2017 в 19:13

1 ответ

Лучший ответ

Насколько я понял, вы хотите использовать searchData в своем конструкторе, но не можете, потому что асинхронный вызов требует времени, а код в конструкторе выполняется до завершения fetchIndustryCodes(). Если это так, то почему бы вам не subscribe подождать в самом конструкторе?

constructor( private completerService: CompleterService,
           private route: ActivatedRoute,
           private industriesService: IndustriesService) { 

            this.fetchIndustryCodes().subscribe(
            (industries_data) => {
                this.searchData = industries_data;
                // whatever you want to do here.
            }, (err) => {console.log("error here")});
}


 private fetchIndustryCodes(): Observable<type> {
    return this._activatedRoute.params
        .switchMap((industries) => this.industriesService.getIndustries())
        .catch((err) => {console.log(err); return "service error";})
}
1
Ashish Ranjan 12 Июн 2017 в 19:36
Пробовал вышеуказанное решение, я думаю, что почти готово. это дает ошибку в this.searchData = industry_data; ошибка: [ts] Тип 'строка | Observable нельзя присвоить типу Industry []. Примечание. Я объявил searchData защищенным searchData: Array ;
 – 
Ajay
12 Июн 2017 в 19:20
Попробуйте использовать возвращаемый тип fetchIndustryCodes() как Observable<Array<Number>>, чтобы выяснить, почему неправильный Observable<string> вызывает проблемы с подпиской
 – 
Ashish Ranjan
12 Июн 2017 в 19:41
Хотя Observable<Array<number>> | any работает нормально, очевидно: P Уходя с работы, прокомментируйте, можете ли вы исправить эту ошибку несоответствия типа, иначе увидим завтра.
 – 
Ashish Ranjan
12 Июн 2017 в 19:53
Также у меня не было типа Industry, поэтому я взял тип как Array
 – 
Ashish Ranjan
12 Июн 2017 в 19:59