使用setInterval块创建JS函数,直到计时器消失

时间:2011-12-07 19:36:11

标签: javascript asynchronous setinterval

我将以下函数作为游戏模拟的一部分编写:

function initialize() {
    setMaxAgents($('#maxAgents').val());
    initCanvas();
    initSwarm();
    renderSwarm();

    date = new Date();
    overallStartTime = date.getTime();

    frames = 0;

        timerID = window.setInterval(doFrame, 25);
}

一旦没有任何东西可以渲染,计时器就会被清除。我希望能够运行此函数n次,如下所示:

    for (var i = 0; i < n; i++) {
        initialize();
    }

然而,就initialize()而言,它会在设置定时器后立即返回,因此运行10次只会在最后一次迭代运行完成时结束。

如何在计时器运行之前使initialize()阻塞,以便我可以连续运行n次函数?

编辑:

这是doFrame()代码。满足条件时,它会停止计时器。

function doFrame() {
    date = new Date();
    startTime = date.getTime();

    moveSwarm();
    renderSwarm();

    if (numAgents == 0) {
        window.clearTimeout(timerID);

        //Calculate average frames per second
        date = new Date();
        var elapsedTime = (date.getTime() - overallStartTime) / 1000;
        frameRate = frames / elapsedTime;
    } else if (frames % 5 == 0) {
        calculateFramerate();
    }

    showFramerate();

    frames++;
}

1 个答案:

答案 0 :(得分:0)

需要递归调用

initialize(),您需要setTimeout而不是setInterval

function initialize(n) {
    setMaxAgents($('#maxAgents').val());
    initCanvas();
    initSwarm();
    renderSwarm();

    date = new Date();
    overallStartTime = date.getTime();

    frames = 0;

    if (n > 0) {
        timerID = window.setTimeout(function () {
            doFrame();
            initialize(n--);
        }, 25);
    }
}

使用您希望它运行多次的参数调用initialize()