我误解了setInterval(),而我期望它在执行时不会出现的值,因此失败了。
function setPairAnimations() {
if (pairs.length > 0) {
if (pairCount < pairs.length) {
intervalNames.push(setInterval(function (pairCount) {
if (topMarker == true) {
pairs[pairCount].pMarker1.setZIndex(201);
pairs[pairCount].pMarker2.setZIndex(200);
topMarker = false;
}
else {
pairs[pairCount].pMarker1.setZIndex(200);
pairs[pairCount].pMarker2.setZIndex(201);
topMarker = true;
}
}, 1000));
++pairCount;
setPairAnimations();
}
}
}
function swapMarkers() {
//first, stop all existing running marker animations
clearIntervals();
if (pairs.length > 0) {
setPairAnimations();
}
if (clusters.length > 0) {
setClusterAnimations();
}
}
第六排炸弹:“ pairs [pairCount] .pMarker1.setZIndex(201);”因为pairs [pairCount]是不确定的。对是文字对象的全局数组,每个对象中包含两个属性或键。
例。
pairs.push({ pMarker1: markerToggles[0].tMarker1, pMarker2: markerToggles[0].tMarker2 });
pairCount是全局计数变量
根据调试器的要求,对已正确填充。在这种情况下,它的长度是1,因此在两个标记对象之间应该只有一个动画开始(在某些情况下,可能会有更多的标记集被动画化,具体取决于在pairs数组中找到的数量)。
我“相信”这个问题,因为在执行setInterval函数时,pairCount值不再是我期望的值(我假设在pairs数组的边界之外)。在此通话中:
intervalNames.push(setInterval(function (pairCount) {
pairCount是未定义的,这就是我上面提到的行失败的原因。但是我不确定该怎么办。是否无法将全局变量传递给匿名函数调用?我不是一个非常有经验的程序员,所以我希望我能正确地解释这一点,并在需要时提供更多代码,但是我真的认为这只是对setInterval如何在循环中工作的一种误解,我只是在滥用它。谢谢。
最佳答案
您已经注意到,在间隔所调用的函数中pairCount
是未定义的。这是因为您正在创建一个参数,该参数在间隔内永远不会传递任何值,并且它正在遮盖全局pairCount
。解决此问题的一种方法是使用全局pairCount
变量作为参数自己调用函数。通过将变量作为参数传递,可以确保在调用setPairAnimations()
函数时其值就是将要使用的值。如果该值从不更改,则根本不需要参数。
intervalNames.push(setInterval(function() {
// call the function, here pairCount is the global variable
intervalAnimation(pairCount);
} , 1000));
// extracted from the setInterval into its own function
function intervalAnimation(pairCount) {
if (topMarker == true) {
pairs[pairCount].pMarker1.setZIndex(201);
pairs[pairCount].pMarker2.setZIndex(200);
topMarker = false;
}
else {
pairs[pairCount].pMarker1.setZIndex(200);
pairs[pairCount].pMarker2.setZIndex(201);
topMarker = true;
}
}
要遍历并确保列表中的每一对都获得动画,您不必递归执行;您可以使用循环,如下所示:
function setPairAnimations() {
// don't need to check length, loop won't run if length is 0
for (pairCount = 0; pairCount < pairs.length; pairCount++) {
intervalNames.push(setInterval(function() {
intervalAnimation(pairCount);
}, 1000));
}
}
关于javascript - 设定间隔的定时情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36945407/