Угловой 4, метод выполняется до того, как конструктор инициализирует значение - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть приложение Angular 4.Я вызываю метод getCity () в конструкторе моего сервиса для инициализации свойства cityId.Я использую cityId в другом методе?например, getData ().Когда я пытаюсь вызвать getData () в компоненте, я получаю сообщение об ошибке, что cityId не определен.Как я думаю, это происходит потому, что getCity () не заканчивает свое выполнение, когда getData () начинает выполняться.Оба метода используют Observables и возвращают Observable.Я решил это с помощью getCity (). ConcatMap ((id) => getData (...)).

Не могли бы вы сказать, пожалуйста, это правильный подход?Может быть, есть более правильные способы?

@Injectable()
export class CustomService {

  cityId: number;

  constructor(private http: HttpClient,
              private citiesService: CitiesService) {
    this.getCityId()
  }

  getCityId() {
    return this.citiesService.getCity().subscribe(
      (city) => {
        this.cityId = city['id']
      });
  }

  getData() {
    /* use this.cityId here */
  }

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вы можете вызвать метод getData() после завершения getCity() из службы:

getCityId() {
  return this.citiesService.getCity().subscribe({
    next: (city) => {
      this.cityId = city['id'];
    }, 
    complete: () => {
      this.getData();
    }
  });
}
0 голосов
/ 26 апреля 2018

Зависит от того, звонит ли getData в сервисную службу, можете ли вы показать, что делает getData ?.Если getData выполняет другой сервисный вызов, вы можете использовать switchMap.Если нет, то обычный map должен работать на вас.

    @Injectable()
    export class CustomService {

    constructor(private http: HttpClient,
                private citiesService: CitiesService) {
    }

    getCityId() {
        return this.citiesService.getCity()
    }

    getDataAsynchronous() {
        return this.getCityId()
            .map(city => city.id)
            .switchMap(id => this.service.serviceCall())
    }

    getDataSynchronous() {
        return this.getCityId()
            .map(city => city.id)
            .map(id => processID(id))
    }

    processID(id: string) {
        // do something with id
        return id;
    }
0 голосов
/ 26 апреля 2018
getCity.subscribe(data => console.log(data))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...