Почему ожидание обещания setInterval в течение некоторого времени l oop вызывает увеличение количества вызовов? - PullRequest
0 голосов
/ 20 февраля 2020

Я просто пытался создать простую асинхронную c функцию, которая работает по расписанию. Я только начинал со счетчика. Но это oop ведет себя не так, как я себе представлял.

async function runCheckChats(){
  while(true){
    count++
    console.log(`this loop is running`);
    await new Promise(res => {
      setInterval(() => {
        count++
        res(3);
      }, 3000)
    })

    console.log(`count = ${count}`)

  }
}

runCheckChats();

При первом запуске l oop счет увеличивается на единицу. Во второй раз он увеличивается в два раза и так далее. Почему это происходит? Когда мы ожидаем обещания, не выйдем ли мы из runCheckChats в случае l oop? Почему кажется, что время продолжает идти, а не ждать? Я ожидал бы, что это будет считаться каждые 3 секунды.

1 Ответ

4 голосов
/ 20 февраля 2020

Интервалы запускаются многократно, и вы создаете все больше и больше интервалов.

Вы начинаете с создания интервала, и через 3 секунды он срабатывает, увеличивает count и разрешает обещание. Поскольку обещание выполнено, вы повторяете свой l oop и создаете дополнительный интервал. Еще через 3 секунды оба интервалов go выключены. Каждый из них увеличивает количество и разрешает каждое соответствующее обещание (одно из них уже разрешено, поэтому ничего не происходит). А затем повторите еще раз, теперь с 3 интервалами.

Если вы хотите сохранить код примерно таким же, как сейчас, используйте время ожидания вместо интервала. Тайм-ауты go отключаются только один раз, поэтому, когда один из них заканчивается, вы можете безопасно создать другой, не накапливая его.

setTimeout(() => {
  count++
  res(3);
}, 3000)

В качестве альтернативы вы могли бы переработать код, чтобы использовать только один интервал, но в этом случае обещания не будут подходящими, поскольку обещания могут быть разрешены только один раз.

function runCheckChats() {
  setInterval(() => {
    count++;
    console.log(`count = ${count}`)
  }, 3000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...