Перезапустите setInterval таймер после нажатия клавиши

Я пытаюсь перебрать массив с индексом i, Что это в настоящее время увеличивает i каждые 5 секунд.

Однако я хочу добавить опцию ручного увеличения i, который должен сбросить таймер обратно на 5 секунд (5000), Как мне добиться этого успешно?

Так, например,

[a, b, c, d, e, f, g]

При запуске он должен отображать (или любую другую функцию, которую я выберу позже) "a", подождать 5 секунд, отобразить "b". Если я нажму клавишу со стрелкой вправо, то он должен немедленно перейти к "c", но затем снова ждать 5 секунд, если только Я нажимаю -> снова.

Я попытался поместить приращение в отдельную функцию, но это не сработало.

    function doThis() {
if (i < (l + 1)) {
                        $('#myDiv').html(myArray[i]);

                        i++;
                        if (i == (l + 1)) {
                            doNext();
                        }
                    }}

                    var intervalHandle = setInterval(doThis, 5000); // start the interval by default
                    var running = true; // true if the interval is running, false if its not.




                            $("body").keydown(function (e) {
                                if (e.keyCode == 39) {//right

                                    console.log("testing");
                                    if (running) {
                                        clearInterval(intervalHandle); // stop interval
                                        running = false; // mark interval as stopped
                                    } else {
                                        intervalHandle = setInterval(doThis, 5000); // start interval
                                        running = true; // mark interval as started
                                        doThis(); // also change the image right now
                                    }


                                } else {
                                    e.preventDefault();
                                }

                            }); 

function doNext(){
//something here, when i ==l+1 as noted above 
}

1 ответ

Одно из возможных решений - обернуть вашу работу в замыкание, где вместо непосредственного вызова setInterval вы вызовете функцию, которая вызовет setInterval, а затем вернете функцию, которую можно использовать для сброса интервала и увеличения переданного значения.

function startInterval(i) {
  var interval = setInterval(function() {
     i++
  }, 5000);

  return function() {
    clearInterval(interval)
    i++;
    interval = setInterval(function() {
     i++
    }, 5000);
  }
}

var i = 0;
var manualIncrement = startInterval(i);

$('body').keydown(function(e) {
  if(e.keyCode === 39) {
    manualIncrement();
  } else {
    e.preventDefault();
  }
})
Другие вопросы по тегам