Javascript 为什么我的间歇时间要开始两次?
我有一个项目,我需要预装100+图像,但我不想垃圾邮件服务器托管的100个非常短的请求图像 为了解决这个问题,我尝试创建一个函数来设置一个间隔,每次迭代都会预加载一个图像。当没有剩余负载时,间隔被清除。如果在第一个间隔仍在运行时再次调用该函数,则它会提前退出该函数 在这一点上,这是一个概念性的问题。为什么这段代码是:Javascript 为什么我的间歇时间要开始两次?,javascript,asynchronous,Javascript,Asynchronous,我有一个项目,我需要预装100+图像,但我不想垃圾邮件服务器托管的100个非常短的请求图像 为了解决这个问题,我尝试创建一个函数来设置一个间隔,每次迭代都会预加载一个图像。当没有剩余负载时,间隔被清除。如果在第一个间隔仍在运行时再次调用该函数,则它会提前退出该函数 在这一点上,这是一个概念性的问题。为什么这段代码是: var ids = [1, 2, 3, 4, 5]; function logger() { var logging = false; var interval
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()
都只是一遍又一遍地执行相同的代码。不过,我确实找到了答案,并回答了我自己的问题。我只是把自动执行部分放错地方了。