Я занимаюсь разработкой демонстрационного сайта, который должен выбирать близлежащие места в соответствии с местоположением пользователя. Пользователь может либо ввести пин-код, либо попросить сайт автоматически определить местоположение.
Рабочий процесс сайта -
1. Нажмите кнопку для отправки - либо есть пин-код, либо нет пин-кода
2. соответствующая функция вызывается в угловой составляющей
3. Компонент отправляет значение пин-кода (например, 110022 или неопределенное, если пользователь выбирает место автоматического определения) методу в AppService.
4. Этот метод вызывает соответствующий метод из MapServic.
5. MapService отвечает за отправку запроса в API Google Map, а затем возвращает ответ на вызов функции из AppService.
6. Затем AppService должен вернуть это значение в компонент
7. Шаблон отображает список элементов, используя ngFor, на основе этого возвращаемого значения (которое является массивом).
Проблема: мне нужно дважды нажать кнопку, чтобы узнать местоположение, а затем разместить результаты.
Что я понял - время отклика от API карты Google медленнее, чем время завершения метода вызывающей функции.
Посоветуйте, пожалуйста, как мне решить эту проблему. Я пытаюсь понять это уже несколько недель, и я уверен, что где-то допустил ошибку.
Я пробовал обратные вызовы клиентов, наблюдаемые и обещания.
- Метод в компоненте -
fetchLocation(form: NgForm) {
console.log(form.value.pinCode);
if (form.value.pinCode !== "") {
const pinCode = form.value.pinCode;
//this.placeType = form.value.type;
this.appService.fetchLocationWithPin(pinCode, this.gmapElement);
} else {
this.location = this.appService.fetchLocation(this.gmapElement);
console.log(this.location);
}
}
</code>
fetchPlace(form: NgForm) {
console.log(this.results);
let placeType;
if (form.value.type === "") {
placeType = "restaurant";
} else {
placeType = form.value.type;
}
this.results = this.appService.fetchPlaces(
this.location,
placeType,
this.gmapElement
);
}
- При условии, что вызов предназначен для определения местоположения автоопределением, метод AppService -
fetchLocation(gmapElement) {
this.location = this.mapServices.detectLocation(gmapElement);
return this.location;
}
- Метод MapService
detectLocation(gmapElement) {
navigator.geolocation.getCurrentPosition(
position => {
this.locationFound = true;
this.location.lat = position.coords.latitude; this.location.lng = position.coords.longitude;
},
() => {
alert("location not found");
return null;
},
{ enableHighAccuracy: true }
);
}
Что я понял - время отклика от API карты Google медленнее, чем время завершения метода вызывающей функции.
Посоветуйте, пожалуйста, как мне решить эту проблему. Я пытаюсь понять это уже несколько недель, и я уверен, что где-то допустил ошибку.