Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组:不丢失同步函数中的元素?_Javascript_Arrays - Fatal编程技术网

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

Javascript 数组:不丢失同步函数中的元素?,javascript,arrays,Javascript,Arrays,我想知道为什么在下面的代码中,当函数setInterval死亡时,coupleFind数组的元素会被删除。想法是,进入a元素并检查她的标签名“ai” 当他接受这个标记时,他从其父元素开始复制整个元素,并将其放入数组中。它可以工作,但只在设置间隔函数内!我不明白,因为我在函数外声明了数组!我相信这是因为“设置间隔”不同步,但我不知道如何解决这个问题 var clicked = 0, totalClicks = 3, index = 0, listIds = new Arra

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

当他接受这个标记时,他从其父元素开始复制整个元素,并将其放入数组中。它可以工作,但只在设置间隔函数内!我不明白,因为我在函数外声明了数组!我相信这是因为“设置间隔”不同步,但我不知道如何解决这个问题

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);
var=0,
总点击数=3,
指数=0,
listIds=新数组(“289657”、“2680235”、“1597254”、“269621”),
coupleFound=新数组(),
视频=document.getElementById(“视频列表”);
var interval=setInterval(函数(){
coupleList=videos.getElementsByTagName(“a”);
对于(var i=coupleList.length;i--;){
对于(j=0;j=总单击次数){
间隔时间;
警报(“我在函数内部。长度为:”+coupfind.length)
}
}, 1000);
警报(“数组的长度为:“+found.length”);

我能做些什么来解决这个问题呢?

你或多或少是对的<代码>设置间隔是异步的。在第三次触发setInterval之前,将立即运行最后一行代码

在JavaScript中没有很好的休眠/阻塞方法。您必须重新构造代码,使其按您想要的顺序运行。通常这意味着使用回调。i、 例如,从
if(clicked>=totalClicks)
块内部调用一个函数,该函数执行您想要的操作,而不是将其放在
setInterval
之后

e、 g

var=0,
总点击数=3,
指数=0,
listIds=新数组(“289657”、“2680235”、“1597254”、“269621”),
coupleFound=新数组(),
视频=document.getElementById(“视频列表”);
函数allDone(){
警报(“数组的长度为:“+found.length”);
}
var interval=setInterval(函数(){
coupleList=videos.getElementsByTagName(“a”);
对于(var i=coupleList.length;i--;){
对于(j=0;j=总单击次数){
间隔时间;
警报(“我在函数内部。长度为:”+coupfind.length);
allDone();
}
}, 1000);

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

提示:检查我们的JS闭包
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);