Javascript: не могу остановить setTimeout - PullRequest
2 голосов
/ 14 января 2010

Я работаю над проверкой прокси-сервера и имею следующий код для запуска запросов с интервалами примерно 5 секунд, используя функцию setTimeout;

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

        }

Исправление или лучший метод будут более ценными.

Спасибо, сообщество переполнения стека!

Ответы [ 6 ]

6 голосов
/ 14 января 2010

Есть 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);
3 голосов
/ 14 января 2010

Где определяется «т»? Он продолжает переопределяться в цикле for, поэтому вы потеряете отслеживание каждого дескриптора тайм-аута ...

Вы можете сохранить массив дескрипторов:

var aTimeoutHandles = new Array();
var iCount = 0;
for (proxy in proxys) {

    var proxytimeout = proxy*5000;

    aTimeoutHandles[iCount++] = setTimeout(doRequest, proxytimeout, url, proxys[proxy]);

}
2 голосов
/ 14 января 2010

Сначала определите t вне обеих функций. Кроме того, вы перезаписываете t при каждой итерации цикла for. Возможно, создайте коллекцию ссылок, а затем, чтобы остановить их, вы перебираете и clearTimeout на каждой.

0 голосов
/ 14 января 2010

Похоже, вы устанавливаете несколько таймаутов (по одному для каждого прокси), но пытаетесь сохранить их в одной переменной. Вам, вероятно, нужно использовать массив вместо простой переменной.

0 голосов
/ 14 января 2010

У вас там несколько проблем:

  1. Основным является то, что вы перезаписываете t на каждой итерации цикла for; вам нужен массив t s для работы вашей структуры.
  2. Вы используете for..in для циклического перемещения по индексам массива. Это не то, для чего нужен for..in (хотя есть много людей, смущенных по этому поводу; см. Эту статью ). for..in просматривает имена свойств объекта , а не индексов массива , и поэтому такое использование прерывается в нетривиальных ситуациях. Просто используйте старомодную петлю for.
  3. Вы объявляете proxys дважды. Это на самом деле безвредно, но ...
  4. Вы вообще не объявляете proxy (что не безвредно; оно становится неявным глобальным).

Я обновил код в отличном ответе Джордана, чтобы решить эти проблемы.

0 голосов
/ 14 января 2010

Вы перезаписываете t каждый раз, когда устанавливаете интервал. Таким образом, вы в конечном итоге очищаете только последний набор.

...