设置超时/循环..还是一头雾水

setTimeout/Loop... still confused

本文关键字:一头 超时 循环 设置      更新时间:2023-09-26

所以从昨天下午开始,我就一直在讨论这个问题。我已经对我试图获得我想要的结果的基本代码进行了各种迭代(我希望每 xx 毫秒按顺序删除标记),但没有任何效果。我得到的结果是他们要么一次全部消失,要么根本不去。我相当确定"完全没有"问题是由于我纠正并得到"一次全部"的语法错误造成的。

所以这是函数...

    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 范围内,就像这样......

        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 循环而不是其他任何东西。

例如,我也尝试将addlistener封装在setTimeout中,认为如果我运行addlistener代码并等待它会起作用。我想我在哪里是我需要想出一种方法来打破循环并等待被调用的函数返回一些东西,但我不确定如何做到这一点。

如果有人能告诉我我是否走在正确的轨道上,我将不胜感激。

如果你不想一次得到所有的结果,你需要给出不同的时间,因为循环是立即执行的,所有的超时都是从这个执行的时间开始计算的:

setTimeout(function() { 
}, 1000*i);

并且为了避免所有迭代都使用相同的i值的问题,请使用闭包保护它

for (i = 0; i < location.length; i++) {
   (function(i){
       setTimeout(function() { 
       }, 1000*i);
   })(i);
}