0

试图搜索这样的东西,但如果这已经在某个地方得到了回答,那么很抱歉我找不到确切的内容。

我需要在一段时间内运行一些代码,不是在一段时间后。基本上我想在页面上快速显示一个数组中的随机值,我希望它继续显示 1 分钟然后停止。

下面的代码只会在 3 秒后开始,并且不会停止,我不确定我该如何实现这一点,所以非常感谢任何帮助。

var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!"];
    function getMessage() {
       return messages[Math.floor(Math.random() * messages.length)];
    }
    setTimeout(function () { oneSecondFunction(); }, 3000);
    function oneSecondFunction() {
        $('#test').html(getMessage());
        setTimeout('oneSecondFunction()', 100);
    }

谢谢

4

5 回答 5

2

为设置标志的结束时间设置第二个超时,并且仅oneSecondFunction在未设置标志时重新安排:

var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!"];
var stop = false;
function getMessage() {
   return messages[Math.floor(Math.random() * messages.length)];
}
setTimeout(function () {
    setTimeout(function () { stop = true; }, 60000); // one minute later
    oneSecondFunction();
}, 3000);
function oneSecondFunction() {
    $('#test').html(getMessage());
    if (!stop) {
        setTimeout('oneSecondFunction()', 100);
    }
}
于 2013-10-06T18:11:18.500 回答
2

尝试

var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!"];

function getMessage() {
    return messages[Math.floor(Math.random() * messages.length)];
}

var interval = null;
setTimeout(function() {
    interval = setInterval(function() {
        // Your code here
        $("#test").html(getMessage());
    }, 100);

    //Stop the functions after 1 minute.
    setTimeout(function() { clearInterval(interval); }, 60 * 1000);
}, 3000);

这将在 3 秒后创建一个间隔,它将每 100 毫秒执行一次代码,持续 1 分钟。

于 2013-10-06T18:12:35.560 回答
1

跟踪自函数第一次运行以来已经过去了多少时间,当该时间超过一分钟时,根本不更新setTimeout调用。

例如:

var timeStarted;

function getMessage() {
   return messages[Math.floor(Math.random() * messages.length)];
}

setTimeout(function () { oneSecondFunction(); }, 3000);

function oneSecondFunction() {
    var now = Date.now();
    timeStarted = timeStarted || now;

    $('#test').html(getMessage());

    if (now - timeStarted < 60000) {
        setTimeout(oneSecondFunction, 100); // you can just write function's name
    }
}
于 2013-10-06T18:11:30.553 回答
1

您只需要跟踪函数运行的时间。然后你测试时间是否结束。这是一个如何做到这一点的示例。

var messages = ["Good!", "Great!", "Awesome!", "Super!", "Nice!"],
    interval = 100,
    delay = 0;

    function getMessage() {
       return messages[Math.floor(Math.random() * messages.length)];
    }
    setTimeout(oneSecondFunction, 3000); // Less code is better.

    function oneSecondFunction() {
        $('#test').html(getMessage());
        delay+= interval;
        if (delay < (3 * 60 * 1000)) { // 3 minutes
             setTimeout(oneSecondFunction, interval);
        }
    }
于 2013-10-06T18:15:00.990 回答
0

您不应该从 oneSecondFunction 设置超时来实现循环。而是使用 setInterval 函数并将您想要调用的函数以及您想要休眠的时间传递给它。然后使用间隔 ID 调用 clearInterval 以停止它。像这样:

function getMessage() {
return messages[Math.floor(Math.random() * messages.length)];
}

 function oneSecondFunction() {
 $("#test").html(getMessage());
}
var intervalID = setInterval(oneSecondFunction, <Delay between runs in millis here>);
function stop() {
clearInterval(intervalID);
}
setTimeout(stop, 60000);
于 2013-10-06T18:35:57.000 回答