Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] Funkcja która zwraca wartość dopiero po otrzymaniu odpowiedzi
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
TomASS
Witam, używam funkcji getLocations z GoogleMaps API.

Funkcja ta łączy się z Google Maps i zwraca mi współrzędne geograficzne adresu, robię sobie funkcję JS:
  1. var ddd;
  2.    function foo(p){
  3.          alert(p); //1
  4.          ddd=p;
  5.    }
  6.      var geo2 = new GClientGeocoder();
  7.      
  8.      function getAddress2(search) {
  9.            var p;
  10.        geo2.getLocations(search, function (result)
  11.          {
  12.            if (result.Status.code == G_GEO_SUCCESS) {
  13.              p = result.Placemark[0].Point.coordinates;
  14.              var lat=p[1];
  15.              var lng=p[0];
  16.              foo(p);
  17.            }
  18.          }
  19.        );
  20.      }
  21.      
  22.      var address =  "Legnicka, Wrocław, Poland";
  23.      getAddress2(address);
  24.      alert(ddd); //2

i teraz funkcja foo jest wywoływana, w niej jest wywoływana funkcja alert, i dziwnym trafem najpierw następuje w funkcji foo return a później dopiero alert nr 2 jest wywoływany (czyli "udefinend") a dopiero później (po otrzymaniu odpowiedzi z Google) alert 1 :/

Jak do tego podejść aby funkcja zwracała mi zmienną (np. p/lat/lng)?
tiraeth
Spróbuj callbacki wywoływać.

http://w3future.com/html/stories/callbacks.xml - tutaj rozwiązanie smile.gif Powinno działać
TomASS
dałem:
  1. var ddd;
  2.  
  3.      var foo=function(){
  4.            alert(ddd);
  5.      }
  6.    
  7.      var geo2 = new GClientGeocoder();
  8.      
  9.      var getAddress2 = function(search) {
  10.            var p;
  11.        geo2.getLocations(search, function (result)
  12.          {
  13.            if (result.Status.code == G_GEO_SUCCESS) {
  14.              p = result.Placemark[0].Point.coordinates;
  15.              var lat=p[1];
  16.              var lng=p[0];
  17.              ddd = p;
  18.            }
  19.          }
  20.        );
  21.      }
  22.      
  23.      var address =  "Legnicka, Wrocław, Poland";
  24.      getAddress2(address);
  25.      foo();

i dalej alert (z funkcji foo) pokazuje mi "undefined" :/ czyli foo wykonało się zanim getAddress2 zwróciło cokolwiek:/
tiraeth
GClientGeocoder wykonuje się dłużej niż ten ułamek sekundy potrzebny na przeparsowanie dalszej części kodu. W skórcie - funkcja poo() się wykonała się później (później callback z getLocations() się wykonał) niż funkcja foo()...
TomASS
To wiem, ale jak temu zaradzić? Aby dalszy kod poczekał?
tiraeth
Kod
var ddd;

     var foo=function(){
           alert(ddd);
     }
  
     var geo2 = new GClientGeocoder();
    
     var getAddress2 = function(search) {
           var p;
       geo2.getLocations(search, function (result)
         {
           if (result.Status.code == G_GEO_SUCCESS) {
             p = result.Placemark[0].Point.coordinates;
             var lat=p[1];
             var lng=p[0];
             ddd = p;
             foo(); // VOILA!
           }
         }
       );
     }
    
     var address =  "Legnicka, Wrocław, Poland";
     getAddress2(address);
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.