this.city
пусто, потому что вы назначаете его в отдельном this
контексте. Вы создали этот новый контекст, когда определили this.geocoder.geocode()
, и использовали ключевое слово function
для создания функции обратного вызова. Замените это на функцию стрелки, и я полагаю, у вас все в порядке снова:
this.geocoder.geocode({'latLng': latlng}, (results, status) => {
// ...
});
Но я не мог быть более неправым.
this.decodeCoord(this.lat, this.long);
alert(this.city);
Это не сработает. Поскольку функция обратного вызова, которую я заставил вас изменить, является, как следует из названия, асинхронной функцией. Поэтому лучшее, что вы можете сделать, это вернуть Promise
из метода decodeCoord
:
decodeCoord(lat, long) {
return new Promise((resolve, reject) => {
// ...
this.geocoder.geocode({'latLng': latlng}, (results, status) => {
if (status == google.maps.GeocoderStatus.OK) {
// ...
resolve();
} else {
reject();
}
});
});
}
И тогда вас еще нет, вам также нужно вернуть обещание из вашего updateLocation
метода:
return this._us.updateUserIndividual(position).
Затем вы можете изменить tryGeolocation
метод:
async tryGeolocation() {
try {
const { coords } = await this.geolocation.getCurrentPosition();
this.lat = coords.latitude;
this.long = coords.longitude;
await this.decodeCoord(coords.latitude, coords.longitude);
alert(this.city);
await this.uploadLocation();
} catch (e) {
console.log('Error getting location', e);
} finally {
this.loading.dismiss();
}
}
И все готово, с хорошим последовательным асинхронным результатом ожидания