问题
I'm working on a proxy server checker and have the following code to start the requests at intervals of roughly 5 seconds using the setTimeout function;
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]);
}
}
However I can't stop them once their started!
function stopcheck() {
clearTimeout(t);
}
A fix or better method will be more that appreciated.
Thank you Stack Overflow Community!
回答1:
There are 2 major problems with your code:
t
is overwritten for each timeout, losing the reference to the previous timeout each iteration.t
is may not be a global variable, thusstopcheck()
might not be able to "see"t
.
Updated functions:
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]);
}
}
Example of use:
var timeouts = check();
// do some other stuff...
stopcheck(timeouts);
回答2:
Where is 't' being defined? It keeps being redefined in the for loop, so you will loose track of each timeout handle...
You could keep an array of handles:
var aTimeoutHandles = new Array();
var iCount = 0;
for (proxy in proxys) {
var proxytimeout = proxy*5000;
aTimeoutHandles[iCount++] = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);
}
回答3:
Define t
outside of both functions first. Additionally, you're overwriting t
with each iteration your for
loop. Perhaps building a collection of references, and then to stop them you cycle through and clearTimeout
on each.
回答4:
You overwrite t
each time you set the interval. Thus you only end up clearing the last one set.
回答5:
Looks like you're setting multiple timeouts (one for each proxy), but trying to save them in the same variable. You probably need to use an array there, instead of a simple variable.
回答6:
You have a few problems there:
- The main one is that you're overwriting
t
on each iteration of yourfor
loop; you need an array oft
s for your structure to work. - You're using
for..in
to loop through the indexes of the array. That's not whatfor..in
is for (although there are a lot of people confused about that; see this article).for..in
loops through the property names of an object, not the indexes of an array, and therefore this usage breaks in non-trivial situations. Just use an old-fashionedfor
loop. - You're declaring
proxys
twice. This is actually harmless, but... - You're not declaring
proxy
at all (which isn't harmless; it becomes an implicit global).
I've updated the code in Jordan's excellent answer to address those.
来源:https://stackoverflow.com/questions/2060601/javascript-cant-stop-the-settimeout