随着更改超时的无限循环

时间:2015-05-29 02:54:18

标签: javascript node.js loops infinite-loop

我有一个包含时间窗口的数组。对于一个简单的例子,我按照以下方式制作了这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。每当我不在窗口中时,我就会以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()

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

2 个答案:

答案 0 :(得分:1)

isInSomeWindow打破了循环。试试这个:

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

答案 1 :(得分:1)

再看一下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;
}