Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [js] Funkcja która zwraca wartość dopiero po otrzymaniu odpowiedzi, Synchronizacja?
TomASS
post 18.06.2008, 22:59:53
Post #1





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
tiraeth
post 18.06.2008, 23:07:09
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Spróbuj callbacki wywoływać.

http://w3future.com/html/stories/callbacks.xml - tutaj rozwiązanie smile.gif Powinno działać
Go to the top of the page
+Quote Post
TomASS
post 18.06.2008, 23:30:50
Post #3





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
tiraeth
post 18.06.2008, 23:33:33
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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()...
Go to the top of the page
+Quote Post
TomASS
post 18.06.2008, 23:34:45
Post #5





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


To wiem, ale jak temu zaradzić? Aby dalszy kod poczekał?


--------------------
Go to the top of the page
+Quote Post
tiraeth
post 18.06.2008, 23:36:16
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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);


Ten post edytował tiraeth 18.06.2008, 23:42:33
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 15:41