超时不断变化的无限循环
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;
}
我有一个包含时间的数组 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;
}