setInterval中的代码执行多次

时间:2015-04-24 00:27:46

标签: javascript canvas web

我正在使用JavaScript开发游戏,我想改变它的行为方式。我正在寻找的是一种每10秒改变一次重力方向的方法。

这是我的setInterval代码,在我的draw()函数中调用,在游戏运行时运行:

setInterval(function(){
    changeGravity();
},10000);

以下是名为的代码:

function changeGravity(){

var rnd = Math.floor((Math.random() * 4) + 1);

var dir = direction[rnd];

gravity.direction = dir;
}

跑步时,间隔在执行前持续10秒,但一旦执行,它就不会停止。我正在寻找的是它每10秒只执行一次。

感谢您的帮助! :)

3 个答案:

答案 0 :(得分:1)

您不会显示draw()函数的代码,但逻辑应该规定这是您需要多次调用的方法。

setInterval()将一直运行,直到使用clearInterval为止。它将运行一个新的"实例"每次调用它时每次调用draw()时都会添加一个新的计时器。

您要么在setInterval()方法之外移动draw()的调用,并确保在需要时只调用一次(请记住为其存储计时器ID,以便以后可以停止它) )。

var timerID = setInterval(changeGravity, 10000);

当你想要阻止它时:

clearInterval(timerID);

或者你会想要使用setTimeout()而不是在超时后触发目标代码一次。但是,这不会被称为 10秒,但仅在调用draw()时。

答案 1 :(得分:0)

你应该关心外面changeGravity的副作用和其他电话。正如它所说,你当前的实现将每10秒执行一次。您应该关注所有变量的范围。作为优化,您无需将changeGravity包装到另一个函数中。你可以传递它的参考,考虑到它是一流的功能:

setInterval(changeGravity, 1000);

答案 2 :(得分:0)

我最近处理了这个重复设置的间隔呼叫。

如果要在整个运行期间仅运行一次,请执行以下操作。

创建一个全局变量:

MyInterval = null;

然后,无论您想第一次还是唯一一次开始进行重力检查,请执行以下操作:

if (MyInterval == null)
{
    MyInterval = setInterval(function() {
        changeGravity();
    }, 10000);
}

因此,最初间隔变量将为null,然后将被分配,然后间隔代码将不再运行,因为该变量不再为null