我有一个计时器循环,我希望执行一个动作三个循环,然后在第四个循环上执行另一个动作,然后重复自己。我认为以下内容可行,但发现counter
未在下次MyLoop()
执行时定义。如果我在全局命名空间中声明它,将定义它,但是每个循环将没有自己的计时器。如何在counter
内保留MyLoop()
值?
function MyLoop(t) {
console.log(counter);
if (typeof counter === 'undefined') {
var counter = 0;
}
setTimeout(function() {
if (counter >= 3) {
console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.')
counter = 0;
} else {
console.log('SUB: Counter: ' + counter + ' Loop ' + t + ' seconds.')
counter++
}
MyLoop(t);
}, t * 1000);
}
MyLoop(2);
MyLoop(4);
答案 0 :(得分:1)
证明问题的非常小的样本:
function S(condition) {
var v;
if (condition) {v = 42;}
}
S(true);
S(false);
您希望第二次通话时v
设置为42吗?可能不是,第二次拨打MyLoop
时也一样。
您将在每次迭代时重新创建闭包 - 而是重复使用您首先调用的相同函数:
function MyLoop(t) {
console.log(counter);
if (typeof counter === 'undefined') {
var counter = 0;
}
var onTick = function() {
if (counter >= 3) {
console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.')
counter = 0;
} else {
console.log('SUB: Counter: ' + counter + ' Loop ' + t + ' seconds.')
counter++
}
setTimeout(onTick, t * 1000);
};
setTimeout(onTick, t * 1000);
}
或者,您可以使用正确的计数器重新创建函数:
function MyLoop(t, counter) {
counter = counter || 0;
setTimeout(function() {
if (counter >= 3) {
console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.')
counter = 0;
} else {
console.log('SUB: Counter: ' + counter + ' Loop ' + t + ' seconds.')
counter++
}
MyLoop(t, counter); // creates new function with updated counter
}, t * 1000);
}
答案 1 :(得分:0)
这是一个递归函数,可以实现您的需要。
<div>
{foreach from=$feature.variants item="var" name="var"}
{if $smarty.foreach.var.iteration == ($smarty.foreach.var.total % 2)}
</div>
<div class="ty-product-feature__value">
{/if}
{$var.variant}
{/foreach}
</div>
function theCountDown(tm, n) {
window.setTimeout( myLoop(n) , tm * 1000);
}
function myLoop (t) {
var counter = t;
if (counter > 1) {
counter--;
console.log('MAIN: Counter: ' + counter + ' Loop ' + t + ' seconds.');
myLoop(counter);
} else {
console.log('SUB: Counter: ' + counter + ' Loop ' + t + ' seconds.');
}
}
myLoop(8);