超时不断变化的无限循环

infinite loop with changing timeouts

我有一个包含时间的数组 windows。对于一个简单的案例,我将这些 10 秒 windows 设置如下,(开始时当前时间将在 window 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}]

然后我设置了两个函数来检查当前时间是否在 window 和某些 window.

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 循环。每当我不在 window 时,我都会以 500 毫秒的周期循环。

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()

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

isInSomeWindow 打破循环。试试这个:

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

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

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

如果 isInWindow(windows[0]) return 为 false,则您点击 else 语句,并且 return 退出函数。

假设如果没有找到匹配的 window,您希望函数 return false,如果循环在没有 returning 的情况下结束,您希望 return:

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