Нахождение ближайшей точки Google Maps API

228
24 января 2018, 12:54

Подскажите: у меня есть 8 точек на карте я хочу найти ближайшую точку от нажатия мыши. Вот код.

for (var i = 0; i < Markers.length; i++)
    {
        var request = {
            origin: point1,
            destination: Markers[i],
            travelMode: 'DRIVING'
        };
        directionsService.route(request, function (result, status) {
            if (status == 'OK') {
                distance = parseInt(result.routes[0].legs[0].distance.value);
                console.log('in' + distance);
                if (distance < maxD) {
                    maxD = distance;
                    pointSave = Markers[i];             
                }
            }
        });
    }
    calcRoute(point1, pointSave);

в переменную Point1 автоматически добавляется координаты клика мыши. В Markers массив точек до которых надо построить маршрут. функция CalcRoute строит маршрут.

Ошибки:

1) Почему в блоке кода

` directionsService.route(request, function (result, status) {
            if (status == 'OK') {
                distance = parseInt(result.routes[0].legs[0].distance.value);
                console.log('in' + distance);
                if (distance < maxD) {
                    maxD = distance;
                    pointSave = Markers[i];             
                }
            }
        });`

Точка Marker[i] не видна? вообще не хочет сохранятся . И переменная i там почему-то всегда равна максимальному размеру массива.

2) Так же переменная distance является глобальной. Почему она не сохраняет свое значение после блока directionsService.route

Answer 1

Корень данных проблем кроется в асинхронности вызова замыкания, которое является параметром directionsService.route.

  1. Это замыкание будет вызвано после выхода из цикла. Соответственно i будет иметь значение Markers.length, а Markers[Markers.length] не существует.

  2. distance хоть и является глобальной, но получает значения позже чем вызывается calcRoute(), поэтому вы не видите нужного результата.

См. также ответы на вопросы:

Использование promise с циклом for

Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания

READ ALSO
Чего нельзя написать на C#? [требует правки]

Чего нельзя написать на C#? [требует правки]

То, что C# довольно универсальный язык и так понятноЭто веб, геймдев , мобильная разработка, десктоп приложения, само собой

190
(TLS) Вычисление Master Secret в C#

(TLS) Вычисление Master Secret в C#

ЗдравствуйтеНе могу найти информацию, как получить Master Secret из компонентов: Client Random, Server Random, PreMasterSecret

162
C# сравнения двух сложных объектов [требует правки]

C# сравнения двух сложных объектов [требует правки]

Никак не получается сделать рабочий кодЕсть у меня два экземпляра структуры, и нужно, чтобы исполнялся цикл do while до тех пор, пока counter не будет...

170
Socket и Windnows Form App

Socket и Windnows Form App

Загуглил самый простой клиент-сервер на сокетах C#Проверил работоспособность кода

185