Поскольку вы имеете дело с наблюдаемыми потоками, которые по своей природе асинхронны,
this.cities
и this.selectedCityIndex
могут обновляться в неизвестном порядке или в неизвестное время.
Таким образом, следующий синхронный код молится о возможности разобраться с неопределенными значениями.
this.selectedCityInfo = this.cities[this.selectedCityIndex];
this.selectedCityWeatherList = this.selectedCityInfo.cityWeather.list;
Например, при попытке назначить this.selectedCityInfo
, this.cities
или this.selectedCityIndex
может быть неопределено, и назначение завершится неудачно.
Более того, в вашем сервисе вы инициализируете обоих ваших субъектов поведения пустыми строками .. которые имеют другой тип данных.
Этот тип дизайна вызывает различные проблемы и неожиданное поведение.
Я бы посоветовал избежать такой архитектуры вашего потока данных.
Вместо этого, я бы предложил объединить обе наблюдаемые в одной подписке с помощью функции CombineLatest или рефакторинг битов следующим образом:
Поскольку в вашем сервисе updateSelectedCity, который вы излучаете из обеих наблюдаемых одновременно, возможно, (если это соответствует вашему приложению) будет проще испустить оба значения в одной наблюдаемой? Тогда мы бы знали, что оба значения определенно поступили, и мы можем сделать назначения this.selectedCityInfo
и this.selectedCityWeatherList
в функции обратного вызова подписки.
В службе:
/* you can keep private property and recast it to Observable,
but you can also subscribe to Subjects and BehaviorSubjects directly
since they extend Observable class.
So that's what I'm doing here */
cityWeatherInfo$ = = new BehaviorSubject<any>({ info: null, index: null });
sendCityWeatherInfo(info,index) {
this.cityWeatherInfo$.next({ info, index });
}
В компоненте:
this.dataService.cityWeatherInfo$
.subscribe(({ info, index }) => {
if (info !== null && index !== null) {
this.cities = info;
this.selectedCityIndex = index;
this.selectedCityInfo = this.cities[this.selectedCityIndex];
this.selectedCityWeatherList = this.selectedCityInfo.cityWeather.list;
}
});
P.S. Я не знаю всех требований вашего приложения, но, возможно, вы можете использовать в своем сервисе простой Subject
вместо BehaviorSubject
. Таким образом, он не будет выдавать начальные нулевые значения, и проверка if (info !== null && index !== null)
не потребуется.