События синхронизации JS в бесконечном цикле / интервале - PullRequest
0 голосов
/ 24 ноября 2018

Я осмотрелся, попробовал несколько решений и не смог найти решение: /

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

Попытка самостоятельного построения бесконечного цикла и логики с помощью 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

...