困惑于一个简单的for循环

时间:2013-01-24 21:31:27

标签: javascript google-maps for-loop

好的,这是一个主要的编辑。我想我可以通过给出一个类似的简单代码的例子来达到目的,但它没有帮助。

我有一个显示Google地图的工作功能,然后放置带有信息窗口的标记。一切正常。然后我决定稍微延迟标记的丢弃,而不是一下子全部丢弃,它们会暂停xx毫秒而下降。我无法让这个工作,我的困惑的主要原因是我似乎对for循环在JavaScript中的工作方式感到困惑。

我正在使用setTimeout,无法使其正常工作,意识到我的混乱与setTimeout无关,所以我将其拉出来并用警报替换它,我得到了同样的行为。我不是在找人写我的代码,我只是不明白我在这里缺少的东西。

我希望for循环是这种行为......

有关 做一点事 做点别的 做另一件事 下

看来我看到的是这种行为......

有关 做一点事 做其他事情(并通过代码为每个循环做) 做另一件事 下

所以这是代码:

    function delaydropmarkers()
    {
        alert("delaydropmarkers");
    }

    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
            }
            );

            delaydropmarkers();

            google.maps.event.addListener(marker, 'click', (function (marker, i) 
            {
                return function () 
                {
                    infowindow.setContent(location[i][0]);
                    infowindow.open(map, marker);
                }
            }
            )(marker, i));

        }

    }

所以我调用了应该创建标记的标记函数,转到delaydropmarkers函数(它现在只有一个警报),然后添加监听器。我仍然可以立刻获得所有标记。我会提前道歉我知道这是我已经感到愚蠢的事情,但我只是没有看到问题。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

第一个错误是使用W3Schools。 http://ryanblunden.com/please-dont-use-w3schools

使其成为您自己的函数,您可以在需要时递归调用:

function showCars(cars, index) {
    index = index || 0;
    if (index < cars.length) {
        console.log(cars[index]);
        setTimeout(function () {
            showCars(cars, ++index);
        }, 2000);
    }
}

var my_cars = ["BMW", "Volvo", "Saab", "Ford"];
showCars(my_cars);

http://jsfiddle.net/UcWTH/4/

我在您的代码中使用console.log而非document.write的原因是因为document.write应该在页面使用时被渲染,而不是之后。幸运的是,在你的情况下也是如此。不幸的是,setTimeout否定了这一点。

使用setTimeout表示您为第一个参数提供的代码将在X毫秒后以异步执行。到那时,如果您正确使用setTimeout,您的页面将被渲染,您将覆盖该文档。就像我说的那样,因为setTimeout是异步的,所以实际上不会阻止/暂停/停止Javascript处理。我认为这是你困惑的根源。你希望它“延迟”2秒,但如果你真的想这样做,你会冻结浏览器2秒钟。 setTimeout允许您在不冻结浏览器的情况下执行此操作。但你不能以你想象的正常方式使用它...这就是为什么我上面的代码不是正常的for循环。