Jak zwrocic string z funkcji do glownej funkcji ?

0

Ponizsza funkcja powinna zwrocic adres po podaniu coordynatow dlugosc i szerokosc

function getAddressName(cords) {
			
				geocoder.geocode({'latLng': cords}, function(results, status) { 
					return results[0].formatted_address;
				});
    			}
 

Jesli wpisze ALERT(results[0].formatted_address); to w komunikacie pokazuje adres
Jesli pisze RETURN results[0].formatted_address; zwraca jako nniezdefinioowane.
Co mozna poradzic ?

0

return, które masz w kodzie tyczy się callbacka (ta anonimowa funkcja przekawywana w parametrze), którego wysyłasz do geocode, a twoja funkcja getAddressName nie ma wyrażenia return, więc domyślnie zwraca undefined. Wstrzyknięcie wyniku na stronę powinieneś zrobić właśnie w callbacku: alert, czy cokolwiek.

1

Jeśli geocoder.geocode jest funkcją synchroniczną - co słusznie zauważył niżej bswierczynski

function getAddressName(cords) {
	var result;
	geocoder.geocode({'latLng': cords}, function(results, status) { 
		result = results[0].formatted_address;
	});
	return result;
}
1

@Marooned:
Oj, a czy geocoder.geocode nie działa asynchronicznie? Nie korzystałem nigdy z tej funkcji, ale na to wygląda. Dlatego właśnie oczekuje callbacka. W takim wypadku to, co napisałeś, nie zadziała -- funkcja getAddressName zwróci undefined bo dopiero po tym jak skończy działanie (!) zostanie odpalony callback i zostanie ustawiona zmienna result, której wartość już dawno została zwrócona.

Jeśli funkcja geocode działa asynchronicznie, to nie da się zaimplementować funkcji getAddressName w sposób synchroniczny, tj. tak żeby zwracała uzyskaną asynchronicznie wartość.

Można jedynie napisać tę funkcję asynchronicznie, czyli jakoś tak:

function getAddressName(cords, callback) {
        // tu może być kod wykonywany przed geocode()
        geocoder.geocode({'latLng': cords}, function(results, status) { 
                var addressName = results[0].formatted_address;
                // tu może być kod wywoływany po geocode()
                if (typeof callback === "function") { 
                        callback(addressName);
                }
        });
}

I wtedy używa się tego tak:

getAddressName(cośtam, function(addressName) {
        alert(addressName);
});
0

No tak, nie znam tego obiektu, więc w sumie możesz mieć rację.

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