JavaScript:SetimeOutを止めることはできません
-
20-09-2019 - |
質問
私はプロキシサーバーチェッカーに取り組んでおり、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);
}
修正またはより良い方法が高く評価されます。
スタックオーバーフローコミュニティに感謝します!
解決
コードには2つの大きな問題があります。
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
間隔を設定するたびに。したがって、最後の1つのセットをクリアするだけです。
複数のタイムアウト(プロキシごとに1つ)を設定しているように見えますが、同じ変数に保存しようとしています。おそらく、単純な変数ではなく、そこで配列を使用する必要があります。
そこにいくつかの問題があります:
- 主なものは、あなたが上書きしていることです
t
あなたの各反復についてfor
ループ;の配列が必要ですt
あなたの構造が機能するためにs。 - あなたが使用しています
for..in
配列のインデックスをループします。それは何ではありませんfor..in
のためです(ただしますが 多く それについて混乱した人々の。 この記事を参照してください).for..in
ループします オブジェクトのプロパティ名, 、ではありません 配列のインデックス, 、したがって、この使用法は、自明でない状況で壊れます。昔ながらのものを使用してくださいfor
ループ。 - あなたは宣言しています
proxys
2回。これは実際には無害ですが... - あなたは宣言していません
proxy
まったく(これは無害ではありません。暗黙のグローバルになります)。
ヨルダンの優れた答えでコードを更新して、それらに対処しました。
所属していません StackOverflow