Я осмотрелся, попробовал несколько решений и не смог найти решение: /
Я хотел бы иметь цикл, который запускается каждую секунду и содержит события, которые запускаются сразличные задержки в зависимости от типа события и условий, к которым относится этот тип события.
Попытка самостоятельного построения бесконечного цикла и логики с помощью while (true) и счетчиков, а также использование setInterval и setTimeout, но все они приводят к одному и тому жеконечный результат (результат: см. нижнюю часть вопроса (на основе примеров кода, которые используют setInterval и setTimeout)).
Этот результат вызван (или, по крайней мере, так мне кажется, было бы неплохо, если бы кто-то мог подтвердить) ситуацией, когда мой callstack содержит новые каждую секунду вызовы всего цикла и X количество необработанных событий Y, которые имеютбыло вызвано -> при самом первом запуске поведение такое, как и ожидалось, но после этого стека вызовов начинает накапливать необработанные события Y и распечатывает их каждую секунду или на скорости основного цикла.
некоторый примеркод для объяснения (используя setInterval и setTimeout):
function start() {
setInterval(eventList, 1000);
};
function eventList() {
console.log("foo")
eventY();
};
async function eventY() {
await newTimeout(0,5).then(() => {
console.log("bar");
})
};
function newTimeout (minutes, seconds) {
let counter = (minutes*60+seconds)*1000;
return new Promise(resolve => setTimeout(resolve, counter));
}
ИЛИ более громоздкая и принудительная задержка (в лучшем случае приводит к непредсказуемому поведению и с более длинными событиями, тот же конечный результат):
function newTimeout(minutes, seconds) {
return new Promise(function(resolve, reject){
let counter = minutes*60+seconds;
let interval = setInterval((() => {
counter--;
if(counter == 0) {
clearInterval(interval);
resolve();
}
}), 1000)
});
};
ТАКЖЕ попытался использовать просто setTimeout, чтобы держаться подальше от setInterval, так как я понимаю, что он может загромождать ваш callstack, ofc нижеприведенное ничего не меняет, глядя на него, но подумал, что я все равно его вставлю, так как я предпочитаюмысль о setTimeout, которую функция вызывает сама, создавая цикл tшляпа способ.
function start() {
try {
eventList();
} catch (err) {
throw err
} finally {
setTimeout(() => start(), 1000);
}
};
конечный результат в основном:
foo
foo
foo
foo
foo
bar
foo
bar
foo
bar
foo