2

私はプロキシサーバーチェッカーに取り組んでおり、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コミュニティに感謝します!

4

6 に答える 6

6

コードには 2 つの大きな問題があります。

  1. tタイムアウトごとに上書きされ、反復ごとに以前のタイムアウトへの参照が失われます。
  2. tis はグローバル変数では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);
于 2010-01-13T22:13:29.413 に答える
3

「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]);

}
于 2010-01-13T22:03:00.227 に答える
2

t最初に両方の関数の外側で定義してください。さらに、ループtを反復するたびに上書きしています。forおそらく、参照のコレクションを構築してから、それらを停止するためにclearTimeout、それぞれを繰り返します。

于 2010-01-13T22:02:37.957 に答える
0

t間隔を設定するたびに上書きします。したがって、最後の 1 つのセットのみをクリアすることになります。

于 2010-01-13T22:03:52.137 に答える
0

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

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

それらに対処するために、ジョーダンの優れた回答のコードを更新しました。

于 2010-01-13T22:04:20.917 に答える
0

複数のタイムアウト (プロキシごとに 1 つ) を設定しているようですが、それらを同じ変数に保存しようとしています。単純な変数の代わりに、おそらく配列を使用する必要があります。

于 2010-01-13T22:05:06.547 に答える