Intereting Posts
Как отображать комментарий в источнике страницы Лучшая практика для вставки больших кусков HTML в элементы с Javascript? Убедитесь, что установлен хотя бы один флажок Простой способ вертикального выравнивания вложенного div? Как загрузить тело HTML после загрузки всех изображений Bootstrap 4: отзывчивое меню боковой панели вверх на панели навигации Как передать текст в 2 столбцах с пользовательским стилем? Может ли я (в javascript) записывать событие или функцию, которая автоматически применяется к одному типу html-тега? Как принудительно проверять тип ввода = элемент электронной почты перед отправкой формы с привязки Как отключить HTML-тег? Как извлечь URL и ссылку на текст из HTML в Perl? как перекрывать два div в css? Создание позиции изображения относительно верхней части страницы Twitter bootstrap nav class. Рабочие столы Связь с местоположением на странице (#id) через механизмы MVC ASP.NET?

Подождите завершения цикла, прежде чем передавать значение в javascript (также карты Google).

Я не использую javascript, поэтому я не знаком с обратными вызовами и ответами. Я использую карты google для отображения расстояния между точкой A и точкой X, Y, Z. Уловка, я хочу использовать javascript, чтобы определить, какая из точек X, Y, Z ближе всего к A, и они отображают направления между ними.

Мой код работает. Я могу найти кратчайшее расстояние из всех трех пунктов назначения, но я застрял с этим глупым взглядом.

Видите ли, Google использует асинхронные обратные вызовы для предоставления данных в браузере, и если я запустил цикл for, чтобы проверить все 3 адресата 1 на 1, я получаю неверные результаты.

Вот код:

var maxDistance = 99999999999; var destn; for (var i = 0; i < locations.length; i++) { var thisDistance = 0; var start = origin; var end = locations[i]; var request = { origin: start, destination: end, travelMode: google.maps.DirectionsTravelMode.DRIVING }; directionsService.route(request, function(response, status) { if (status == google.maps.DirectionsStatus.OK) { thisDistance = response.routes[0].legs[0].distance.value; if (thisDistance < maxDistance) { destn = response.routes[0].legs[0].end_address; maxDistance = thisDistance; } } else { document.getElementById("addressNotFound").style.display = 'block'; } }); } calcShortestRoute(origin, destn); 

Поэтому, очевидно, когда я вызываю эту функцию, значение destn появляется как неопределенное, поскольку цикл завершается, и обработчик google еще не получил данные. Если я вызову функцию еще 1 раз, я получаю значение destn, полученное от предыдущего обратного вызова (который ранее не задавался).

Кто-нибудь, пожалуйста, скажите мне, как я могу это исправить.

Вам нужно подождать, пока все три ответа Google не будут возвращены. Простым решением является: перевести вызов функции расчета расстояния в анонимную функцию в конце, а затем рассчитать расстояния, только если все ответы вернулись:

  // global count variable var callbackCount = 0; for (var i = 0; i 

то calcShortestRoute выглядит так:

 function calcShortestRoute(origin, destn, locationCount) { // increment callback count callbackCount++; if (callbackCount == locationCount) { // all responses have returned // do your distance checking .... } } 

У вас не будет значения в destn когда вы выходите из цикла for, потому что он устанавливается асинхронно после получения ваших результатов с directionsService.route() . Вместо этого вам нужно будет отслеживать, сколько запросов было возвращено, и вызовите свою функцию из ответного обратного вызова после того, как вы получили все ответы:

 ... // your code var responseCount = 0; for (var i = 0; i < locations.length; i++) { ... // your code directionsService.route(request, function(response, status) { ... // your code if (++responseCount == locations.length) { calcShortestRoute(origin, destn); } }); } 

Изменить: я перечитываю ваш вопрос и думаю, что лучше понимаю, что делает ваш код. Этот ответ должен быть более точным (и более кратким для загрузки!).