数组:不要丢失同步函数中的元素?

时间:2013-12-06 19:46:26

标签: javascript arrays

我想知道为什么在下面的代码中,当函数setInterval死掉时,会删除coupleFound数组的元素。想法是,进入一个元素并检查她的标签名称“ai”。

当他接受这个标签时,他会从父母那里复制整个元素,然后放入coupleFound数组。它工作,但只在设置Interval功能内!我不明白因为我在函数之外声明了数组!我相信这是因为“设置间隔”不同步,但我不知道如何解决这个问题!

var clicked = 0,
    totalClicks = 3,
    index = 0,
    listIds = new Array("289657", "2680235", "1597254", "269621"),
    coupleFound = new Array( ),
    videos = document.getElementById( "videos_list" );

var interval = setInterval(function( ) {
    coupleList = videos.getElementsByTagName( "a" );

    for(var i = coupleList.length; i--;) {
        for(j=0; j < listIds.length; j++) {
            if(coupleList[i].getAttribute( "ai" ) == listIds[j]) {
                coupleFound[index] = coupleList[i].parentNode;
                index++;
                break;
            }
        }
        videos.removeChild( videos.lastChild );
    }

    document.getElementById('btnMoreVideos').click();
    clicked++;
    if(clicked >= totalClicks) {
        clearInterval( interval );
        alert("I'm inside of the function. The length is:" + coupleFound.length)
    }
}, 1000);

alert("The length of the array is:" + coupleFound.length);

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

你或多或少是正确的。 setInterval是异步的。在setInterval第三次触发之前,您的最后一行代码将立即运行。

在JavaScript中没有好的睡眠/阻止方法。您必须重新构建代码,以便它按您想要的顺序运行。通常这意味着使用回调。即,从if(clicked >= totalClicks)块内部调用一个函数来执行您想要的操作,而不是将其放在setInterval之后。

如,

var clicked = 0,
    totalClicks = 3,
    index = 0,
    listIds = new Array("289657", "2680235", "1597254", "269621"),
    coupleFound = new Array( ),
    videos = document.getElementById( "videos_list" );


function allDone() {
    alert("The length of the array is:" + coupleFound.length);
}

var interval = setInterval(function( ) {
    coupleList = videos.getElementsByTagName( "a" );

    for(var i = coupleList.length; i--;) {
        for(j=0; j < listIds.length; j++) {
            if(coupleList[i].getAttribute( "ai" ) == listIds[j]) {
                coupleFound[index] = coupleList[i].parentNode;
                index++;
                break;
            }
        }
        videos.removeChild( videos.lastChild );
    }

    document.getElementById('btnMoreVideos').click();
    clicked++;
    if(clicked >= totalClicks) {
        clearInterval( interval );
        alert("I'm inside of the function. The length is:" + coupleFound.length);
        allDone();
    }
}, 1000);

尽管你应该尽可能地避免使用全局变量。如果您不需要访问太多变量,可以将coupleFound或其长度传递给allDone