1

我一直在尝试将 lat lng 坐标中的多个地图标记放在 xml 文件中。

这是我的代码

    var stockistName=[];
        var stockistAddress=[];
        var stockistLat=[];
        var stockistLng=[];


    function getAddresses(country){

         $.get('xml/stockists/'+country+'.xml', function(d){
                      alert("file Opened");
         $(d).find('stockist').each(function(){
            $stockist = $(this);
            stockistName.push($stockist.attr("name"));      
            stockistAddress.push($stockist.attr("address"));
            stockistLat.push($stockist.attr("lat"));
            stockistLng.push($stockist.attr("lng"));
            });
        });
    placeMarkerArray();
}
function placeMarkerArray(){

        alert("this is element 0"+stockistName[0]);
        for(var i=0; i<stockistName.length;i++){
            alert("in the function got addresses");
        //alert("inloop"+i+"");

        var newLatLng = new google.maps.LatLng(stockistLat[i], stockistLng[i]);
        //alert("making marker lat lng:"+newLatLng+"")
            if (markerArray[i] != undefined){
                markerArray[i].setPosition(newLatLng); 
            }
            else{
                markerArray[i] = new google.maps.Marker({
                    position: newLatLng,
                    map: map,
                    icon:'images/icons/MAP/van.png'
                });
            }
        }
}`

我一直在阅读有关回调函数的信息,但似乎无法理解这个想法。我一直认为事情会按照你写的顺序执行。如果有人能给我任何方向,那就太好了。

4

2 回答 2

0

我认为事情通常是通过一个例子最清楚的,所以:

// define a function that accepts a function as a parameter and calls
// this function after one second asynchronously.
function executeActionDelayed (action) {
    window.setTimeout(function () {
        action();
        }, 1000);
}

// Now call the above function with an anonymous function as the parameter.
executeActionDelayed(function () {
    console.log("Execute action delayed called.");
});

console.log("End, or is it?");

正如您在此示例中看到的,“结束,还是它?” 在“执行操作延迟调用。”之前实际上已记录到控制台。这是因为window.setTimeout是异步的。我创建的函数executeActionDelayed正在使用回调!

这类似于您使用 jQuery 的get函数所做的事情:

// This function is being passed in as a parameter and will be
// called only when the response has been received.
$.get('xml/stockists/'+country+'.xml', function(d){
    // stuff removed.
});

那么这对你的意义是什么?

您必须调用使用您传入的成功回调中的数据的函数:

function getAddresses(country){
     $.get('xml/stockists/'+country+'.xml', function(d){
        alert("file Opened");
        $(d).find('stockist').each(function(){
            $stockist = $(this);
            stockistName.push($stockist.attr("name"));      
            stockistAddress.push($stockist.attr("address"));
            stockistLat.push($stockist.attr("lat"));
            stockistLng.push($stockist.attr("lng"));
        });
        placeMarkerArray();
    });
}
于 2013-07-11T12:33:11.437 回答
0

$.get方法需要下载一个文件,这可能需要一些时间。这就是为什么你给它一个回调函数作为第二个参数,它会在下载完成后被调用。

同时,您的 JS 会按照您编写的顺序继续执行。这就是为什么在开始下载文件的get调用之后执行placeMarkerArray函数的原因。您应该只在$.get回调中移动placeMarkerArray()调用。

另外,你应该改进你的代码缩进,它会让事情变得更清晰。

于 2013-07-11T12:30:27.853 回答