2009-06-03 3 views
0

, пожалуйста, ознакомьтесь со следующим кодом. Когда значение i == 0, предупреждение 1 печатает значения переменных в соответствии с логикой. Но если я попытаюсь напечатать значения (предупреждение 2), он просто скажет «undefined, undefined». Мой вопрос заключается в том, какие изменения мне придется внести, чтобы получить значения, напечатанные во втором предупреждении (Alert 2), как и для предупреждения 1?Как установить переменную javascript изнутри функции?

var testPoint = []; 

function load() { 
    if (GBrowserIsCompatible()) { 
    map = new GMap2(document.getElementById("map_canvas")); 
    map.addControl(new GSmallMapControl()); 
    map.addControl(new GMapTypeControl()); 
    map.setCenter(new GLatLng(52.5271463402545, -1.50573921491311), 8, G_HYBRID_MAP); 

    GDownloadUrl("controllers/gmap_genxml2.php", function(data) { 
     var xml = GXml.parse(data); 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
     for (var i = 0; i < markers.length; i++) { 
     if(i == 0) { 
      testPoint["lat"] = parseFloat(markers[i].getAttribute("lat")); 
      testPoint["lng"] = parseFloat(markers[i].getAttribute("lng")); 

      /********* ALERT 1 ***********/ 
      alert(testPoint["lat"]+" "+testPoint["lng"]); 
      /********* ALERT 1 End ***********/ 
     } 
     var name = markers[i].getAttribute("name"); 
     var address = markers[i].getAttribute("address"); 
     var type = markers[i].getAttribute("type"); 
     var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), 
           parseFloat(markers[i].getAttribute("lng"))); 
     var marker = createMarker(point, name, address, type); 
     map.addOverlay(marker); 
     } 
    }); 

    /********* ALERT 2 ******************/ 
    alert(testPoint["lat"]+" "+testPoint["lng"]); 
    /********* ALERT 2 Start ***********/ 
    } 
} 

Благодарим за помощь. DeeJay

ответ

0
testPoint = []; 

    // This global var is introduced to mark that testPoint values are not yet loaded. 
    var isLoaded = false; 

    function load() { 

    if (GBrowserIsCompatible()) { 
     map = new GMap2(document.getElementById("map_canvas")); 
     map.addControl(new GSmallMapControl()); 
     map.addControl(new GMapTypeControl()); 
     map.setCenter(new GLatLng(52.5271463402545, -1.50573921491311), 8, G_HYBRID_MAP); 

    GDownloadUrl("controllers/gmap_genxml2.php", function(data) { 
     var xml = GXml.parse(data); 
     var markers = xml.documentElement.getElementsByTagName("marker"); 
     for (var i = 0; i < markers.length; i++) { 
     if(i == 0) { 
       testPoint["lat"] = parseFloat(markers[i].getAttribute("lat")); 
       testPoint["lng"] = parseFloat(markers[i].getAttribute("lng")); 

       /********* ALERT 1 ***********/ 
       alert(testPoint["lat"]+" "+testPoint["lng"]); 
       /********* ALERT 1 End ***********/ 

       // Set it to true to indicate that testPoint array is already loaded. 
       isLoaded = true; 
     } 
     var name = markers[i].getAttribute("name"); 
     var address = markers[i].getAttribute("address"); 
     var type = markers[i].getAttribute("type"); 
     var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), 
           parseFloat(markers[i].getAttribute("lng"))); 
     var marker = createMarker(point, name, address, type); 
     map.addOverlay(marker); 
     } 
    }); 

    /********* ALERT 2 ******************/ 
    // Try to alert testPoint each 0.5 sec until we can successfully do it. 
    function alert2() { 
     // if testPoint is loaded - then alert it, if not then try in 0.5 sec. 
     if (isLoaded) { 
       alert(testPoint["lat"]+" "+testPoint["lng"]) 
     } else { 
       setTimeout(alert2, 500); 
     } 
    }; 

    alert2(); 
    /********* ALERT 2 Start ***********/ 
    } 
} 
+0

Это работает !! Круто. Благодарю. – TigerTiger

+1

Почему бы вам просто не выполнить фактическую работу alert2 в конце анонимной функции обратного вызова? петли опроса действительно слабы. Также будет более подходящим setInterval. – annakata

+0

@ "annakata" Можете ли вы представить какой-либо пример, пожалуйста? Благодарю. – TigerTiger

1

Два объектных ключа lat и lng оцениваются только в функции обратного вызова, вызываемой GDownloadUrl.

Вам нужно дождаться, когда он будет выполнен один раз, а затем вы получите правильные значения.

Предлагаю вам переместить предупреждение 2 в конце этой функции обратного вызова.

1

Вы передаете указатель на функцию вызова другой функции. Это не обязательно приводит к выполнению кода. Возможно, время отключено. Ваш ALERT 1 происходит, когда функция вызывается (отлично), но ALERT 2 фактически выполняется до вызова функции!

Попробуйте положить 1 секунду задержка перед печатью содержимого testPoint.

4

Вы должны понимать, что много JavaScript основано на событиях. Вот что происходит:

GDownloadUrl выполняет обратный вызов. Второй аргумент - это функция, которая будет называться , когда запрос будет завершен.. Это не будет называться сразу. Это важно. После того, как вы закроете вызов GDownloadUrl, Javascript продолжает работать. Он не ждет завершения запроса. На самом деле, если вы оставите оба предупреждения, вы увидите, что предупреждение 2 будет срабатывать перед предупреждением 1. Таким образом, если вы хотите сделать что-то конкретное с этими переменными, как только они будут извлечены, вы должны перенести этот код на функцию и вызвать ее из обратного вызова GDownloadUrl. Это именно то, как работает JavaScript, и вы привыкнете к нему.

+0

Да .. Ответ «Светлана Максимчук» помог мне. Спасибо за ваш ответ. – TigerTiger

Смежные вопросы