Javascript SetInterval проблема времени, общее время - PullRequest
0 голосов
/ 04 августа 2011
base ={time:0};    
var loop = 0;
 setInterval(function(){
    if(base.time === 9000){
        move();
       base.time = 0;
     }

  base.time ++;                      

},1);

не должен двигаться ();функция происходит каждые 9 секунд?Я рассчитал это и его намного меньше, почему это?

Ответы [ 4 ]

1 голос
/ 04 августа 2011

setInterval не будет работать каждую миллисекунду.Существует минимально возможный интервал, который больше этого.

Если вы хотите, чтобы что-то запускалось через девять секунд, вы должны использовать setTimeout() в течение 9 секунд.Кроме того, ваш код не сбрасывает base.time обратно на ноль, поэтому в любом случае он будет совпадать только с 9000.

Если вы хотите, чтобы он запускался каждые 9 секунд, тогда вы можете использовать setInterval(handler, 9000) или использовать setTimeout(handler, 9000) и затем установите следующий setTimeout в функции-обработчике.

Это будет выполнять move() каждые девять секунд:

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

Вот полезная статья по теме: http://www.adequatelygood.com/2010/2/Minimum-Timer-Intervals-in-JavaScript.

Чтобы сбросить время до 9 секунд при нажатии кнопки, используйте этот код:

var intervalTimer;

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

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

startTimer();

Смотрите его в действии здесь: http://jsfiddle.net/jfriend00/sF2by/.

0 голосов
/ 04 августа 2011

Вы написали в комментарии, что есть кнопка, которая сбрасывает время, и поэтому вы не хотите просто устанавливать TimeTimeout для полной задержки. Вот как с этим справиться:

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

Каждый раз, когда вызывается start (), время будет сбрасываться на 9 секунд, а по истечении 9 секунд будет вызываться move () и запускается другой 9-секундный интервал. Если вы на самом деле не хотите, чтобы это происходило неоднократно, просто используйте вместо него setTimeout.

Ключ использует clearInterval (или clearTimeout), чтобы отменить предыдущую 9-секундную задержку и начать новую. Вызывать clearInterval с нежелательным значением безвредно.

0 голосов
/ 04 августа 2011

Вы не можете рассчитывать на setInterval на самом деле работает каждые 1 мс. Если ЦП используется для другого процесса, он может не работать в течение 1 секунды . Вместо этого используйте одно из следующего:

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.
0 голосов
/ 04 августа 2011

Интервалы легки как пирог!

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

setInterval(move, 9000);

Посмотрите, как это работает здесь на jsFiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...