2010-01-13 3 views
2

Я работаю над проверкой прокси-сервера и имею следующий код для запуска запросов с интервалом примерно 5 секунд с использованием функции setTimeout;Javascript: не удается остановить 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]); 

      } 
     } 

Однако я не могу остановить их после их начала!

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

Благодарим вас за переполнение!

+0

Вы уверены, что вы на самом деле назвать 'stopcheck()' и проверить, если вы определили 'T' глобально? – kjagiello

+0

В качестве обновления; Функция останавливает последнее задание. – Ben

+0

Да и это называется. – Ben

ответ

6

Есть 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); 
+0

't' * была * глобальной переменной, насколько мы могли бы сказать из его опубликованного кода. он не был объявлен ни в одной из функций, то есть либо он был объявлен глобально, либо он не был. В последнем случае он станет неявным свойством «окна» (например, неявным глобальным, хотя это и ужасно). Ваш подход, конечно, лучше этого. –

+0

Получил свободу исправления других проблем в коде. –

2

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

3

Где? T 'определяется? Он продолжает быть переопределен в цикл, так что вы потеряете след каждого тайм-аут ручки ...

Вы можете держать массив ручек:

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

    var proxytimeout = proxy*5000; 

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

} 
+0

Если вы устанавливаете несколько тайм-аутов, вам нужно отслеживать каждый из них, как вы делаете это сейчас, каждый дескриптор для тайм-аута получает nuked, когда создается каждый новый таймер. Также не забудьте определить массив дескрипторов в области, где могут отображаться обе функции. – nortron

+0

Ой - не можете ли вы создать несколько тайм-аутов? Я уверен, что я это сделал раньше! Re: array - Конечно, я просто демонстрировал, что вы можете хранить ручки тайм-аута в массиве. Наверное, я должен был упомянуть, что область действия переменной важна ... – Robert

+0

@Cryo: Ваш комментарий правильный для вопроса OP, но ответ Роберта хранит ручки в массиве. –

0

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

0

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

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

Я обновил код в превосходном ответе Иордании, чтобы обратиться к ним.

0

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

Смежные вопросы