Jak zwrócić wartość dystansu z funkcji

0

Hej, używam Google do wyznaczenia odległości.

function calculateDistance(origin, destination) {
            var service = new google.maps.DistanceMatrixService();
            service.getDistanceMatrix(
                {
                    origins: [origin],
                    destinations: [destination],
                    travelMode: google.maps.TravelMode.DRIVING,
                    unitSystem: google.maps.UnitSystem.METRIC,
                    avoidHighways: false,
                    avoidTolls: false
                }, callback
            );
        }

        function callback(response, status) {
            if (status != google.maps.DistanceMatrixStatus.OK) {
                console.log(err);
            } else {
                var origin = response.originAddresses[0];
                var destination = response.destinationAddresses[0];
                if (response.rows[0].elements[0].status === "ZERO_RESULTS") {
                    console.log("nie ma drog pomiedzy"
                        + origin + " and " + destination);
                } else {
                    var distance = response.rows[0].elements[0].distance;
                    var distance_value = distance.value; // w metrach
                    var distance_text = distance.text;   // np. 2,4 km
                    var distanceKm = distance_text.substring(0, distance_text.length - 3);
                    console.log("Odległość: " + distance_text + " lub " + distance_value/1000 + " lub " + distanceKm);
                }
            }
        }

chciałbym aby funkcja calculateDistance zwracała mi distanceKm tak abym mógł ją wywołać i użyć tego co zwraca dalej.

0

Właśnie po to jest w niej callback.

0

nie tak wprost. Call do Google jest asynchroniczny co za tym idzie na rezultat trzeba poczekać.

Celem jest użycie dystansu gdzieś indziej np. w polu select przy zmianie wartości.
Może jakoś inaczej to obejść?

0

przerobiłem kod z użyciem Promise i async/await. Pytanie / prośba o ewentualną przeróbkę na ładniej?

function fetchDistance(origin, destination) {
            return new Promise(function(resolve, reject) {
                var service = new google.maps.DistanceMatrixService();
                service.getDistanceMatrix(
                {
                    origins: [origin],
                    destinations: [destination],
                    travelMode: google.maps.TravelMode.DRIVING,
                    unitSystem: google.maps.UnitSystem.METRIC,
                    avoidHighways: false,
                    avoidTolls: false
                },
                function(resp, status) {
                    if (status !== google.maps.DistanceMatrixStatus.OK) {
                        response = reject(status);
                    } else {
                        response = resolve(resp.rows[0].elements[0].distance.value); // dystans w metrach np. 1236
                    }
                });
            });
        }

oraz

async function getDistanceAsync(start, end){
            const result = await fetchDistance(start, end);
            return result / 1000;
        }

używam tego w ten sposób

getDistanceAsync(ORIGIN_ADDRESS, destinationAddress).then(result => {
            if(result <= <jakis_tam)
            {
                  // ...
            }
        });

1 użytkowników online, w tym zalogowanych: 0, gości: 1