无限循环和不断变化的超时

infinite loop with changing timeouts

本文关键字:超时 变化 无限循环      更新时间:2023-09-26

我有一个包含时间窗口的数组。对于一个简单的例子,我将这些10秒的窗口如下,(在开始时,当前时间将在窗口1内)

var now = new Date();
windowList = [
    { id: 1,
        start: new Date().setSeconds(now.getSeconds() - 5),
        end: new Date().setSeconds(now.getSeconds() + 5),
        waitTime: 2000},
    { id: 2,
        start: new Date().setSeconds(now.getSeconds() + 10),
        end: new Date().setSeconds(now.getSeconds() + 20),
        waitTime: 500}]

然后我设置了两个函数来检查当前时间是否在一个窗口和某个窗口中。

function isInWindow(window){
    var now = new Date();
    return (window.start < now && now < window.end);
}

function isInSomeWindow(windows){
    for (var i = 0; i < windows.length; i++) {
        if(isInWindow(windows[i])){
            return windows[i];
            break;
        } else {
            return false;
        }
    }
}

现在我想遍历windowList,因为我循环了一段时间的waitTime。当我不在窗口时,我循环周期为500ms。

function daynmicRepeat() {
    var localPeriod = 1000;
    setTimeout(function () {
        window = isInSomeWindow(windowList);
        if (window){
            console.log('in window ' + window.id + ' @ ' + new Date())
            localPeriod = window.waitTime;
        } else {
            console.log('not in a window @ ' + new Date());
            localPeriod = 500;
        }
        daynmicRepeat();
    },localPeriod);
}

当我运行它

daynmicRepeat()

我从第一个窗口开始,然后最终出来,但似乎从来没有进入第二个窗口。我做错了什么?

再看一下isInSomeWindow函数中的循环——它永远不会超过第一次运行:

if(isInWindow(windows[i])){
    return windows[i];
    break;
} else {
    return false;
}

如果isInWindow(windows[0])返回false,则点击else语句,并从函数中返回。

假设你想让函数在没有找到匹配的窗口时返回false,你想在循环结束而不返回时返回:

function isInSomeWindow(windows){
    for (var i = 0; i < windows.length; i++) {
        if(isInWindow(windows[i])){
            return windows[i];
            break;
        }
    }
    return false;
}

isInSomeWindow打破循环。试试这个:

function isInSomeWindow(windows){
    for (var i = 0; i < windows.length; i++) {
        if(isInWindow(windows[i])){
            return windows[i];
    }
}