API-вызов с динамическим URL-адресом — Observable undefined

У меня есть приложение, в котором я сначала динамически загружаю API-URL, а затем делаю к ним запросы.

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

Это мой код в службе, которая делает API-вызовы. Это зависит от другой службы, называемой sls, которая будет получать динамические API-URL.

 queryFlights(body: FlightBoardApiCallBody): Observable<any>{
    if (this.getFlightsURL){
      return this.queryFlightsHelper(body, this.getFlightsURL);
    } else {
      this.sls.getServices()
        .map(s => s[GET_FLIGTHS_SERVICE_NAME])
        .switchMap(url => {
          if (url != null){
            return this.queryFlightsHelper(body, url);
          } else {
            return Observable.empty();
          }
        });
    }
  }

Фактический API-вызов происходит здесь. Это работает при вызове из строки 3.

private queryFlightsHelper(b: FlightBoardApiCallBody, url: string): Observable<any>{...} 

В моем контроллере я делаю это (та же функция при запуске или вызовы вручную позже).:

this.flightSubscription = this.f.queryFlights(body).subscribe((res) => {...});

При запуске я получаю эту ошибку:

Невозможно прочитать свойство «подписаться» на неопределенное

Если я вызываю функцию одним нажатием кнопки, URL-адреса уже предварительно загружены. Поэтому он использует путь if вместо пути else, и все работает нормально.

Может кто-нибудь объяснить, что я делаю неправильно в другом пути?


person NDDT    schedule 22.05.2018    source источник


Ответы (1)


Вам не хватает оператора возврата:

 queryFlights(body: FlightBoardApiCallBody): Observable<any>{
if (this.getFlightsURL){
  return this.queryFlightsHelper(body, this.getFlightsURL);
} else {
  return this.sls.getServices()  // HERE
    .map(s => s[GET_FLIGTHS_SERVICE_NAME])
    .switchMap(url => {
      if (url != null){
        return this.queryFlightsHelper(body, url);
      } else {
        return Observable.empty();
      }
    });
}

}

person jacekbj    schedule 22.05.2018