Интервалы запускаются многократно, и вы создаете все больше и больше интервалов.
Вы начинаете с создания интервала, и через 3 секунды он срабатывает, увеличивает count
и разрешает обещание. Поскольку обещание выполнено, вы повторяете свой l oop и создаете дополнительный интервал. Еще через 3 секунды оба интервалов go выключены. Каждый из них увеличивает количество и разрешает каждое соответствующее обещание (одно из них уже разрешено, поэтому ничего не происходит). А затем повторите еще раз, теперь с 3 интервалами.
Если вы хотите сохранить код примерно таким же, как сейчас, используйте время ожидания вместо интервала. Тайм-ауты go отключаются только один раз, поэтому, когда один из них заканчивается, вы можете безопасно создать другой, не накапливая его.
setTimeout(() => {
count++
res(3);
}, 3000)
В качестве альтернативы вы могли бы переработать код, чтобы использовать только один интервал, но в этом случае обещания не будут подходящими, поскольку обещания могут быть разрешены только один раз.
function runCheckChats() {
setInterval(() => {
count++;
console.log(`count = ${count}`)
}, 3000);
}