运行 为数组中的每个间隔 ID 再次设置间隔
Run set Interval again for every interval ID in array
我目前正在将一组 setInterval ID 存储在一个数组中。
我最初是如何设置间隔的:
intervalId = setInterval(bridgeCall, 10000);
interValArray.push(intervalId);
我目前有一个按钮,可以通过调用此函数停止当前 运行 的所有间隔:
function stopCampaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
clearInterval(interValArray[i]);
console.log("Stopped");
}
error = "Stopped"
Error();
} else {
error = "Nothing Running"
Error();
}
}
这相应地有效,所以我尝试做相反的事情来重新启动它们,如下所示:
function Campaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
setInterval(interValArray[i],10000);
console.log("Start");
}
error = "Started"
Error();
} else {
error = "No Agents"
Error();
}
}
但不断收到错误提示:
timers.js:275
timer._repeat();
^
TypeError: timer._repeat is not a function
at wrapper [as _onTimeout] (timers.js:275:11)
at Timer.listOnTimeout (timers.js:92:15)
是否可以setInterval/Start 重新启动它们?
您不能使用计时器句柄执行除取消计时器以外的任何操作。这一行:
setInterval(interValArray[i],10000);
尝试使用句柄“重启”间隔。内置计时器的东西根本不支持。您需要执行与最初启动它时相同的操作才能再次启动它。
您还没有展示您最初是如何启动它们的,所以我无法建议您如何重组才能再次启动它们,但这里有一个综合示例:
// Initial setup
var timers = [];
for (var n = 0; n < 5; ++n) {
startTimer(function(val) {
document.getElementById("a" + val).innerHTML += ".";
}.bind(null, n), Math.random() * 1000);
}
function startTimer(f, interval) {
timers.push({
f: f,
interval: interval,
handle: setInterval(f, interval)
});
}
// Stop them after three seconds
setTimeout(function() {
console.log("Pausing...");
timers.forEach(function(timer) {
clearInterval(timer.handle);
});
}, 3000);
// Start them two seconds after that
setTimeout(function() {
console.log("Restarting...");
timers.forEach(function(timer) {
timer.handle = setInterval(timer.f, timer.interval);
});
}, 5000);
// Then stop them for good a couple of seconds later
setTimeout(function() {
console.log("Stopping");
timers.forEach(function(timer) {
clearInterval(timer.handle);
});
}, 7000);
<div id="a0"> </div>
<div id="a1"> </div>
<div id="a2"> </div>
<div id="a3"> </div>
<div id="a4"> </div>
函数 setInterval(function, interval)
returns 间隔的 ID,您在将它们存储在数组中时已经了解它。
但是,您不能 'restart' 仅使用其 ID 的间隔。您必须先清除间隔,然后使用将项目存储在数组中时使用的初始参数调用 setInterval()
。
您可以修改数组中的项目以保留重新启动超时所需的所有信息:
var interValArray = [];
nextTimeout = {
fn: functionNameToCall,
interval: 10000,
id: 0
}
nextTimeout.id = window.setInterval(
nextTimeout.fn,
nextTimeout.interval
)
interValArray.push( nextTimeout )
您的新 stopCampaign()
看起来像这样:
function stopCampaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
clearInterval(interValArray[i].id);
console.log("Stopped");
}
error = "Stopped"
Error();
} else {
error = "Nothing Running"
Error();
}
}
你的新 Campaign()
看起来像这样:
function Campaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
interValArray[i].id =
setInterval(interValArray[i].fn,interValArray[i].interval);
console.log("Start");
}
error = "Started"
Error();
} else {
error = "No Agents"
Error();
}
}
我目前正在将一组 setInterval ID 存储在一个数组中。
我最初是如何设置间隔的:
intervalId = setInterval(bridgeCall, 10000);
interValArray.push(intervalId);
我目前有一个按钮,可以通过调用此函数停止当前 运行 的所有间隔:
function stopCampaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
clearInterval(interValArray[i]);
console.log("Stopped");
}
error = "Stopped"
Error();
} else {
error = "Nothing Running"
Error();
}
}
这相应地有效,所以我尝试做相反的事情来重新启动它们,如下所示:
function Campaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
setInterval(interValArray[i],10000);
console.log("Start");
}
error = "Started"
Error();
} else {
error = "No Agents"
Error();
}
}
但不断收到错误提示:
timers.js:275
timer._repeat();
^
TypeError: timer._repeat is not a function
at wrapper [as _onTimeout] (timers.js:275:11)
at Timer.listOnTimeout (timers.js:92:15)
是否可以setInterval/Start 重新启动它们?
您不能使用计时器句柄执行除取消计时器以外的任何操作。这一行:
setInterval(interValArray[i],10000);
尝试使用句柄“重启”间隔。内置计时器的东西根本不支持。您需要执行与最初启动它时相同的操作才能再次启动它。
您还没有展示您最初是如何启动它们的,所以我无法建议您如何重组才能再次启动它们,但这里有一个综合示例:
// Initial setup
var timers = [];
for (var n = 0; n < 5; ++n) {
startTimer(function(val) {
document.getElementById("a" + val).innerHTML += ".";
}.bind(null, n), Math.random() * 1000);
}
function startTimer(f, interval) {
timers.push({
f: f,
interval: interval,
handle: setInterval(f, interval)
});
}
// Stop them after three seconds
setTimeout(function() {
console.log("Pausing...");
timers.forEach(function(timer) {
clearInterval(timer.handle);
});
}, 3000);
// Start them two seconds after that
setTimeout(function() {
console.log("Restarting...");
timers.forEach(function(timer) {
timer.handle = setInterval(timer.f, timer.interval);
});
}, 5000);
// Then stop them for good a couple of seconds later
setTimeout(function() {
console.log("Stopping");
timers.forEach(function(timer) {
clearInterval(timer.handle);
});
}, 7000);
<div id="a0"> </div>
<div id="a1"> </div>
<div id="a2"> </div>
<div id="a3"> </div>
<div id="a4"> </div>
函数 setInterval(function, interval)
returns 间隔的 ID,您在将它们存储在数组中时已经了解它。
但是,您不能 'restart' 仅使用其 ID 的间隔。您必须先清除间隔,然后使用将项目存储在数组中时使用的初始参数调用 setInterval()
。
您可以修改数组中的项目以保留重新启动超时所需的所有信息:
var interValArray = [];
nextTimeout = {
fn: functionNameToCall,
interval: 10000,
id: 0
}
nextTimeout.id = window.setInterval(
nextTimeout.fn,
nextTimeout.interval
)
interValArray.push( nextTimeout )
您的新 stopCampaign()
看起来像这样:
function stopCampaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
clearInterval(interValArray[i].id);
console.log("Stopped");
}
error = "Stopped"
Error();
} else {
error = "Nothing Running"
Error();
}
}
你的新 Campaign()
看起来像这样:
function Campaign() {
if (interValArray.length > 0) {
for (i = 0; i < interValArray.length; i++) {
interValArray[i].id =
setInterval(interValArray[i].fn,interValArray[i].interval);
console.log("Start");
}
error = "Started"
Error();
} else {
error = "No Agents"
Error();
}
}