Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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_Asynchronous - Fatal编程技术网

Javascript 为什么我的间歇时间要开始两次?

Javascript 为什么我的间歇时间要开始两次?,javascript,asynchronous,Javascript,Asynchronous,我有一个项目,我需要预装100+图像,但我不想垃圾邮件服务器托管的100个非常短的请求图像 为了解决这个问题,我尝试创建一个函数来设置一个间隔,每次迭代都会预加载一个图像。当没有剩余负载时,间隔被清除。如果在第一个间隔仍在运行时再次调用该函数,则它会提前退出该函数 在这一点上,这是一个概念性的问题。为什么这段代码是: var ids = [1, 2, 3, 4, 5]; function logger() { var logging = false; var interval

我有一个项目,我需要预装100+图像,但我不想垃圾邮件服务器托管的100个非常短的请求图像

为了解决这个问题,我尝试创建一个函数来设置一个间隔,每次迭代都会预加载一个图像。当没有剩余负载时,间隔被清除。如果在第一个间隔仍在运行时再次调用该函数,则它会提前退出该函数

在这一点上,这是一个概念性的问题。为什么这段代码是:

var ids = [1, 2, 3, 4, 5];

function logger() {
    var logging = false;
    var interval = {};

    function log() {
        if (ids.length) {
            console.log(ids.shift());   
        } else {
            console.log('Logging done!');
            clearInterval(interval);
            logging = false;
        }
    }

    return (function() {
        if (!logging) {
            console.log('Logging started!');
            logging = true;
            interval = setInterval(log, 250);
            return null;
        } else {
            console.log('Logging already started!');
            return null;
        }
    })()
}

//First call to logger
logger();

//Add a few more elements to ids array
ids = ids.concat([6, 7, 9, 9, 10]);

//Call logger again
logger();
两次启动间隔,并几乎同时记录一对元素?如果您想查看此代码段的行为,下面是我使用的

--编辑--

谢谢大家的帮助:)。我现在意识到,
logging
interval
没有被保存。为了在不声明全局变量的情况下保存它们,我只需要使声明自动执行,而不是立即调用返回的函数。

@deceze你说得对。 每次调用记录器时都会初始化var日志记录。
只需将该标志设置为全局变量。

我已经弄明白了,并意识到为什么我现在会出现意外行为。这就是我真正想要的:

var ids = [1, 2, 3, 4, 5];

var logger = (function() {
    var logging = false;
    var interval = {};

    function log() {
        if (ids.length > 0) {
            console.log(ids.shift());   
        } else {
            console.log('Logging done!');
            clearInterval(interval);
            logging = false;
        }
    }

    return function() {
        if (!logging) {
            console.log('Logging started!');
            logging = true;
            interval = setInterval(log, 250);
            return null;
        } else {
            console.log('Logging already started!');
            return null;
        }
    }
})()

//First call to logger
logger();

//Add a few more elements to ids array
ids = ids.concat([6, 7, 9, 9, 10]);

//Call lagger again
logger();

我只是在返回的函数上放了一个闭包,而我真的应该包装初始声明。这是上面代码的详细说明。

因为您调用了
logger()
两次,每次都调用
setTimeout
。。。!?也许您认为您正在使用
var logging
解决这个问题,但是
var logging
是一个局部变量,在两个单独的
logger()
调用之间不共享。函数中有一个标志,用来检查间隔是否已设置。只有当标志(日志记录)为false时,自执行函数才应该设置间隔。这就是现实与您的期望不同的地方<每次调用
logger()
时,code>logging设置为
false
。在你的代码中很清楚地说明了这一点-我想我现在明白了。我不知道为什么我期望返回的闭包之外的变量会被保存。你没有实际创建闭包,因为你没有返回函数。您将返回执行该内部函数的结果,该函数在两种情况下都返回
null
。这里没有创建闭包。因此,每次调用
logger()
都只是一遍又一遍地执行相同的代码。不过,我确实找到了答案,并回答了我自己的问题。我只是把自动执行部分放错地方了。