質問

私はプロキシサーバーチェッカーに取り組んでおり、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つの大きな問題があります。

  1. t タイムアウトごとに上書きされ、各反復の前のタイムアウトへの参照が失われます。
  2. 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つ)を設定しているように見えますが、同じ変数に保存しようとしています。おそらく、単純な変数ではなく、そこで配列を使用する必要があります。

そこにいくつかの問題があります:

  1. 主なものは、あなたが上書きしていることです t あなたの各反復について for ループ;の配列が必要です tあなたの構造が機能するためにs。
  2. あなたが使用しています for..in 配列のインデックスをループします。それは何ではありません for..in のためです(ただしますが 多く それについて混乱した人々の。 この記事を参照してください). for..in ループします オブジェクトのプロパティ名, 、ではありません 配列のインデックス, 、したがって、この使用法は、自明でない状況で壊れます。昔ながらのものを使用してください for ループ。
  3. あなたは宣言しています proxys 2回。これは実際には無害ですが...
  4. あなたは宣言していません proxy まったく(これは無害ではありません。暗黙のグローバルになります)。

ヨルダンの優れた答えでコードを更新して、それらに対処しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top