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 t开发者_JAVA技巧hem once their started!
function stopcheck() {
clearTimeout(t);
}
A fix or better method will be more that appreciated.
Thank you Stack Overflow Community!
There are 2 major problems with your code:
tis overwritten for each timeout, losing the reference to the previous timeout each iteration.tis 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);
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]);
}
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.
You overwrite t each time you set the interval. Thus you only end up clearing the last one set.
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.
You have a few problems there:
- The main one is that you're overwriting
ton each iteration of yourforloop; you need an array ofts for your structure to work. - You're using
for..into loop through the indexes of the array. That's not whatfor..inis for (although there are a lot of people confused about that; see this article).for..inloops 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-fashionedforloop. - You're declaring
proxystwice. This is actually harmless, but... - You're not declaring
proxyat all (which isn't harmless; it becomes an implicit global).
I've updated the code in Jordan's excellent answer to address those.
加载中,请稍侯......
精彩评论