无限循环/间隔内的JS计时事件

时间:2018-11-24 00:26:51

标签: javascript node.js settimeout setinterval

我环顾四周,尝试了几种解决方案,但找不到解决方案:/

我要做的是使循环每秒运行一次,其中包含根据事件类型和事件类型相关条件而触发的延迟不同的事件。

尝试使用while(true)和计数器,以及使用setInterval和setTimeout来构建无限循环和逻辑,但是所有结果都返回相同的最终结果(结果:请参阅问题的底部(基于使用setInterval和setTimeout)。

此结果是由于(或者至少我相信,如果有人可以确认的话)会很高兴,因为我的调用堆栈每秒钟包含新的整个循环调用,以及X个未处理的eventY的调用- >第一次运行时,行为就如预期的那样,但是此后,调用栈开始累积未处理的事件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)
    });
};

ALSO尝试仅使用setTimeout来远离setInterval,因为我知道这很可能会使您的调用栈混乱,ofc下面的内容现在并未改变,但我认为我会把它放在任何地方,因为我倾向于更喜欢setTimeout的想法,即函数调用自身以这种方式创建循环。

function start() {
    try {
        eventList();    
    } catch (err) {
        throw err
    } finally {
        setTimeout(() => start(), 1000);
    }
};

最终结果基本上是:

foo

foo

foo

foo

foo

foo

foo

foo

0 个答案:

没有答案