我误解了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/

10-10 09:00