1

我正在尝试使用 setTimeOut 一个一个地显示标记,但它不起作用。这是我的代码:

function showOneByOne(arrayOfMarkersObj) {
    for (u in arrayOfMarkersObj) {           
        setTimeout(function() {      
            arrayOfMarkersObj[u].setVisible(true);
        }, 3000);
    }
}

问题是它只显示地图上的最后一个标记,而不是所有标记。但是,如果我把

arrayOfMarkersObj[u].setVisible(true);

在 setTimeOut 之外,它显示所有标记。

为什么会发生?

4

2 回答 2

2

将密钥存储到数组中(如果您仅使用支持 ECMA5 的浏览器,则可以按照注释中的建议使用Object.keys()代替:

var keys = [];
for (u in arrayOfMarkersObj)
    keys.push(u); //assuming arrayOfMarkersObj is an object not an array?

现在在你的setTimeout

var current = 0;

function reveal() {
    arrayOfMarkersObj[keys[current++]].setVisible(true);
    if (current < keys.length) setTimeout(reveal, 3000);
}
reveal();

如果您想要第一个延迟切换最后一行:

setTimeout(reveal, 3000);

帖子中的示例不起作用的原因是因为在调用它时u不可用setTimeout。事件setTimeout集调用的代码在window对象上调用。

为了使 var 可用,您需要将其存储为“升级”,通常是全局范围或包装函数内部(通过that = thisas thisbecome的引用window,然后使用thatinside setTimeout)来访问它。

于 2013-06-07T07:47:58.623 回答
1

在 JavaScript 中,内部作用域中的变量值与定义变量的作用域绑定。这意味着回调在执行时将从定义u的范围中检索 的值u,即showOneByOne(). 因此,每次执行回调u时都将等于arrayOfMarkersObj.length -1(循环后的最终值for)。

一种简单的解决方法应该是使用forEach,即使不清楚每个元素是否需要不同的回调/计时器。您不妨按照Ken-Abdias Software的回答中的建议使用一个。

于 2013-06-07T07:49:26.847 回答