setTimeout / Loop ...仍然困惑

时间:2013-01-25 16:48:00

标签: javascript for-loop settimeout

所以自昨天下午以来我一直都在这。我已经完成了基本代码的各种迭代,我试图得到我想要的结果(我希望每隔xx ms按顺序删除标记),但没有任何效果。我得到的结果是他们一次全部或根本没有。我很确定“根本没有”的问题是由于我纠正的语法错误并且得到了“一下子”。

所以这是函数......

    function marker(location) 
    {

        geocoder = new google.maps.Geocoder();
        var latlng = new google.maps.LatLng(37.5, -98.35);
        var mapOptions = 
        {
            zoom: 5,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        map = new google.maps.Map(document.getElementById('googleMap'), mapOptions);

        var infowindow = new google.maps.InfoWindow(), marker, i;

        for (i = 0; i < location.length; i++) 

        {


            marker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(location[i][1], location[i][2]),
                animation: google.maps.Animation.DROP,
                map: map
            }
            );


            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {

                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }

            }
            )(marker, i));


        }

    }

我认为我应该做的就是在内,就像这样......

        for (i = 0; i < location.length; i++) 

        {
           setTimeout(function() { 

            marker = new google.maps.Marker(
            {
                position: new google.maps.LatLng(location[i][1], location[i][2]),
                animation: google.maps.Animation.DROP,
                map: map
            }
            );


            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {

                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }

            }
            )(marker, i));
            }, 1000)
        }

但是这不起作用,我尝试过的其他事情也没有用。我已经看了很多解释,其中大部分似乎都有意义,但我可以想出来,我认为它更多的是关于for循环而不是其他任何东西。

作为一个例子,我也尝试在setTimeout中封装addlistener,想一想我是否运行addlistener代码并等待它会起作用。我想我在哪里,我需要想出一个方法来摆脱循环并等待被调用的函数返回一些东西,但我不知道该怎么做。

如果有人可以告诉我,我是在正确的轨道上,我会很感激。

1 个答案:

答案 0 :(得分:1)

如果您不想立即获得所有结果,则需要给出不同的时间,因为循环立即执行,所有超时都是从执行时算起的:

setTimeout(function() { 

}, 1000*i);

为避免使用相同i值的所有迭代问题,请使用

在闭包中保护它
for (i = 0; i < location.length; i++) {
   (function(i){
       setTimeout(function() { 

       }, 1000*i);
   })(i);
}