Jak zwrocic string z funkcji do glownej funkcji ?

Jak zwrocic string z funkcji do glownej funkcji ?
masterO
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 5 lat
  • Postów:1025
0

Ponizsza funkcja powinna zwrocic adres po podaniu coordynatow dlugosc i szerokosc

Kopiuj
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 ?

edytowany 2x, ostatnio: masterO
KO
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:39
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.

Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
  • Lokalizacja:Poznań
1

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

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

edytowany 1x, ostatnio: Marooned
BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
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:

Kopiuj
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:

Kopiuj
getAddressName(cośtam, function(addressName) {
        alert(addressName);
});
edytowany 2x, ostatnio: bswierczynski
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
  • Lokalizacja:Poznań
0

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


BS
Ja też nie znam, ale myślę na chłopski rozum: gdyby to miało działać synchronicznie, to na siłę nie tworzyliby niewygodnego API jak do funkcji asynchronicznej ;). Ale pewności nie mam z braku znajomości tej funkcji.
Marooned
Dobrze prawisz, tak z rozpędu napisałem, bo u nas często używamy takich rzeczy synchronicznie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.