[英]Javascript: Can't stop the setTimeout
我正在使用代理服务器检查程序并使用以下代码使用setTimeout函数以大约5秒的间隔启动请求;
function check() {
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var proxys = proxys.split(",");
for (proxy in proxys) {
var proxytimeout = proxy*5000;
t = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
}
但是一旦他们开始我就无法阻止他们!
function stopcheck() {
clearTimeout(t);
}
修复或更好的方法将更受欢迎。
谢谢Stack Overflow社区!
您的代码有两个主要问题:
t
,每次迭代都会丢失对先前超时的引用。 t
可能不是全局变量,因此stopcheck()
可能无法“看到” t
。 更新功能:
function check() {
var url = document.getElementById('url').value;
var proxys = document.getElementById('proxys').value.replace(/\n/g,',');
var timeouts = [];
var index;
var proxytimeout;
proxys = proxys.split(",");
for (index = 0; index < proxys.length; ++index) {
proxytimeout = index * 5000;
timeouts[timeouts.length] = setTimeout(
doRequest, proxytimeout, url, proxys[index];
);
}
return timeouts;
}
function stopcheck(timeouts) {
for (var i = 0; i < timeouts.length; i++) {
clearTimeout(timeouts[i]);
}
}
使用示例:
var timeouts = check();
// do some other stuff...
stopcheck(timeouts);
't'在哪里被定义? 它继续在for循环中重新定义,因此你将松开每个超时句柄的跟踪...
你可以保留一个句柄数组:
var aTimeoutHandles = new Array();
var iCount = 0;
for (proxy in proxys) {
var proxytimeout = proxy*5000;
aTimeoutHandles[iCount++] = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
首先在两个函数之外定义t
。 此外,你覆盖t
每次迭代您for
循环。 也许构建一个引用集合,然后阻止它们在每个引用上循环和clearTimeout
。
每次设置间隔时都会覆盖t
。 因此,您最终只能清除最后一组。
你有一些问题:
t
您的每一次迭代for
循环; 你需要一个t
的数组来让你的结构工作。 for..in
循环for..in
数组的索引。 这不是什么for..in
是(虽然有很多人混淆有关; 看到这篇文章 )。 for..in
循环for..in
对象的属性名称 ,而不是数组的索引 ,因此这种用法在非平凡的情况下会中断。 只需使用老式的for
循环。 proxys
。 这实际上是无害的,但...... proxy
(这不是无害的;它变成了一个隐含的全局)。 我已经更新了Jordan的优秀答案中的代码来解决这些问题。
看起来您正在设置多个超时(每个代理一个),但尝试将它们保存在同一个变量中。 您可能需要在那里使用数组,而不是简单的变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.