Кажется, что у вас возникла проблема с тем, как долго ваше решение требуется для обновления. К сожалению, это не так, если вы не реструктурируете, как ваши _locationService
используют данные. В настоящее время у вас есть:
- ПОЛУЧИТЬ геокод от широты и долготы
- ждать запрос, чтобы завершить
- набор данных из запроса № 1 к месту
данные обновления
- прибудете от места
- ожидания для запроса на закончить
- набор местоположения обновления
- обновления DOM ж/обновляемого место
Есть два запроса, соединенных вместе. Если это возможно, я бы объединить эти две функции в одном вызов на вашем внутреннем интерфейсе, так что вы можете назвать что-то вроде
this._locationService.geocode(this.location.latitude, this.location.longitude).
subscribe(location => {
this.location = location;
this.submitted = true;
this.submitting = false;
});
Конечно, это будет работать только если ваш сервер содержит данные для обслуживания этого типа запроса. Если сервер также должен делать HTTP-вызовы, то изменение его на вышеуказанное будет спорным.
Если вышеуказанное невозможно, вы можете обновить DOM после завершения первого запроса. Если все будет хорошо, функция updateLocation
вернет то же местоположение, которое было отправлено на сервер, так или иначе? Вы можете обновить DOM с локально доступными значениями и вместо обновления DOM при успешном выполнении второй функции изменить их только при возникновении ошибки. Это заставит ваше время отклика на 50% быстрее. Что-то вроде этого.
this._locationService.geocode(this.location.latitude, this.location.longitude).
subscribe(position => {
this.location.city = this.findAddressPart(position, "locality", "long");
this.location.country = this.findAddressPart(position, "country", "long");
// SET DOM HERE using this.location values
this._locationService.updateLocation(this.location)
.subscribe(
location => {
this.location = location;
// optionally SET DOM HERE again
this.submitted = true;
this.submitting = false;
},
error => {
// SET DOM HERE reflecting error
}
);
});
Вы пытались запустить это в угловой зоне? using this.zone.run (() => {}) Вы должны выполнять только назначения местоположений внутри зоны – galvan
Как это работает? – Mantas
Пожалуйста, обратитесь к этой статье: http://www.joshmorony.com/understanding-zones-and-change-detection-in-ionic-2-angular-2/ – galvan