Когда вы вызываете showLocation()
в вашем getData()
обратном вызове, это вызывает два вызова геокодера, и если оба вызова успешны calculateDistance()
.
Однако оба этих вызова геокодера требуют времени. Первый getLocations()
запускает запрос геокода и позволяет ему продолжить работу, которая будет обработана в его обратном вызове. Внутри этой функции есть еще один запрос, который обрабатывается в его собственном обратном вызове.
Пока они ждут результатов, выполнение кода продолжилось и достигло alert(distanceVal)
, хотя calculateDistance()
еще не был вызван. Следовательно, distanceVal
еще не установлен.
Когда вы нажмете кнопку еще раз, глобальный distanceVal
будет заполнен всеми функциями обратного вызова, поэтому (хотя второй набор геокодов / обратных вызовов завершен , а не завершен), он будет иметь значение для отображения. Однако, если вы измените тестируемые значения, вы обнаружите, что оно отображает старое значение, которое сейчас неверно.
Все , которое зависит от значений, найденных в функции обратного вызова , должно быть обработано в этой функции обратного вызова. Если вы переместите отображение данных в calculateDistance()
, все будет хорошо, потому что данные доступны для этой функции.