javascript - setTimeout/Loop...仍然很困惑

标签 javascript for-loop settimeout

所以从昨天下午开始我就一直在思考这个问题。我已经对基本代码进行了各种迭代,试图获得我想要的结果(我想每 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);
}

关于javascript - setTimeout/Loop...仍然很困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526440/

相关文章:

javascript - Vue 不将事件传递给 child

javascript - 如何使用javascriptexecutor实现拖放?

java - 当变量已经声明时,为什么我的 for 循环需要一个标识符?

javascript - 为什么这个 Javascript 方法不会继续调用自己?

javascript - 许多 setTimeouts 的结果

javascript - jQuery 新手,需要一些帮助

javascript - 在保持纵横比的同时缩放背景图像

c++ - 我的范围循环出现逻辑错误

javascript - for 循环中的引用数组生成悬停事件

javascript - 在reactjs中使用setTimeout连续改变状态