Избегайте выполнения setInterval() в начале интервала

Я заметил, что функция setInterval() на самом деле запускается (например, принимает значения) в начале интервала, затем ждет и возвращает результат в конце интервала. Если значения меняются в середине интервала, он все равно будет выполняться так, как это было бы в начале. Это вызывает нежелательное поведение в моем слайдере. Есть ли способ заставить setInterval() сделать оба в самом конце интервала? Желательно без jQuery.

РЕДАКТИРОВАТЬ: Пока я конвертировал свой код для публикации здесь, проблема решилась сама собой. Оказывается, это не имеет ничего общего с моим вопросом. Извините, я обязательно отправлю код в следующий раз. СПАСИБО ЗА ОТВЕТЫ!:) Надеюсь, они помогут кому-то в будущем, так как я все равно не смог найти такой вопрос.

3 ответа

Вы можете связать необходимые переменные на window объект.

window.myVariable = 'Important String';

setInterval(function() {
  doSomethingWith(window.myVariable);
}, 2000);

// Variable is changed
window.myVariable = 'Less Important String';

Да. Используйте setTimeout рекурсивно, что, как правило, лучше.

function doSomething() {
  setTimeout(function () {
    console.log('something')
    doSomething()
  }, 2000)
}

console.log('start')
doSomething()

Вы должны опубликовать часть своего кода. Я не совсем уверен, если это ваша проблема, но если вы посмотрите на это:

setInterval(() => {
  var message = 'ok';
  console.log(message);
}, 1000);

message = 'not ok';

Переменная 'message', определенная внутри setInterval, относится к функции, передаваемой в setInterval. Поэтому, когда я пытаюсь изменить переменную вне этой области, она не будет работать. Я на самом деле случайно создаю новую переменную в объекте окна.

Однако, если я сделаю это:

var message = 'ok';

setInterval(() => {
  console.log(message);
}, 1000);

message = 'not ok';

Переменная 'message' успешно изменена, и setInterval вызовет переменную с этим изменением.

Другие вопросы по тегам