设定间隔的定时情况

时间:2016-04-29 18:41:34

标签: javascript jquery

我误解了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();
    }
}

第6行向下炸弹:“对[pairCount] .pMarker1.setZIndex(201);”因为pair [pairCount]未定义。 pairs是一个全局的文字对象数组,每个对象包含两个属性或键。 例。

pairs.push({ pMarker1: markerToggles[0].tMarker1, pMarker2: markerToggles[0].tMarker2 });

pairCount是一个全局计数变量

正如我预期的那样,按照调试器正确填充了对。在这种情况下,它的长度为1,因此在两个标记对象之间应该只有一个动画开始(在某些情况下,它可能是更多的动画标记集,具体取决于在对数组中找到的数量)。

我“相信”问题是,在setInterval函数执行时,pairCount值不再是我所期望的(我假设在对数组的边界之外)。在这个电话中:

intervalNames.push(setInterval(function (pairCount) {

pairCount未定义,这就是我上面提到的那条线失败的原因。但我不知道该怎么办。是不是我不能将全局变量传递给匿名函数调用?我不是一个非常有经验的程序员,所以我希望我能正确解释这个并且如果需要可以提供更多的代码,但我真的认为这只是对循环中setInterval如何工作的一种理解,我只是在滥用它。 THX。

1 个答案:

答案 0 :(得分:1)

正如您所注意到的,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));
    }
}