开发者

Javascript SetInterval timing issue, total time

base ={time:0};    
var loop = 0;
 setInterval(function(){
    if(base.time === 9000){
        move();
       base.time = 0;
     }

  base.time ++;                      

},1);

Shouldn't the move();开发者_如何学Python function occur every 9s? I timed it and its much less, why is that?


setInterval will not run every millisecond. There is a minimum possible interval that is longer than that.

If you want something to run in nine seconds, you should use setTimeout() for 9 seconds. Plus your code doesn't reset base.time back to zero so it would only match 9000 once anyway.

If you want it to run every 9 seconds, then you can use setInterval(handler, 9000) or you can use setTimeout(handler, 9000) and then set the next setTimeout in your handler function.

This will execute move() every nine seconds:

var intervalTimer = setInterval(function(){
    move();
}, 9000);

Here's a useful article on the topic: http://www.adequatelygood.com/2010/2/Minimum-Timer-Intervals-in-JavaScript.

To reset the time back to 9 seconds when a button is clicked use this code:

var intervalTimer;

function startTimer() {
    intervalTimer = setInterval(function(){
        move();
    }, 9000);
}

function handleClick() {
    clearInterval(intervalTimer);   // stop currently running interval
    startTimer();
}

startTimer();

See it in action here: http://jsfiddle.net/jfriend00/sF2by/.


Intervals are easy as pie!

var move = function(){
    alert("move!");
};

setInterval(move, 9000);

See it work here on jsFiddle


You can't count on setInterval actually running every 1 ms. If the CPU is used for another process, it might not run for 1 second. Instead, use one of the following:

function move() {
    // Do stuff.
}

// The obvious solution.
// Certain browsers (Chrome) may put the script in "inactive" mode which will
// pause setInterval code. This means move will be run too few times, if you
// actually depend on it being called X times for Y time.
setInterval(move, 9000);

// The other solution.
// Get the delta between each loop and run the move loop as necessary.
// WARNING: This is not efficient, and you should only use this if you have a
//          good reason to do so.
// EXTRA WARNING: This code is actually retarded in its current form. It's just
//                here to show you how you'd do it. Since you didn't post your
//                original problem, it's hard to know what you're really after.
var time = +new Date, frequency = 9000;
setInterval(function () {
    var dt = new Date - time;
    // Check if we've waited long enough.
    if (dt >= frequency) {
        // If the process hangs for 20 seconds, this value would be 2. Usually,
        // it will be 1.
        // Also, Chrome will pause interval counters, so if a tab is inactive,
        // this count could be really high when the tab gets focus again.
        var times = Math.floor(dt / frequency);
        console.log('Moving', times, 'time(s)!');
        for (var i = 0; i < times; i++) {
            move();
        }
        // Start counting time from the last update.
        time += times * frequency;
    }
}, 1); // 1 could probably be much higher here. Depends on your use case.


You wrote in a comment that there is a button which resets the time, and that's why you don't want to just setTimeout for the full delay. Here's how to handle that:

var running;
function start() {
    clearInterval(running);
    running = clearInterval(function () {
        move();
    }, 9000);
}

Every time start() is called, the time will be reset to 9 seconds from now, and if 9 seconds elapse, move() will be called and another 9-second interval will start. If you don't actually want it to happen repeatedly, just use setTimeout instead.

The key is using clearInterval (or clearTimeout) to cancel your previous 9-second-delay and start a new one. It is harmless to call clearInterval with a junk value.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜