2013-04-19 3 views
0

В следующем коде, почему он может создать возможную бесконечную рекурсию и почему использование памяти продолжает подниматься и как ее решить?Возможная бесконечная рекурсия в методе?

function waitForKeyElements (selectorTxt, actionFunction) { 
    if (getElementByXPath(selectorTxt) == null) { 
     var timeControl = setInterval (function() { 
        waitForKeyElements (selectorTxt, actionFunction); 
       }, 
       300 
      ); 
    } else { 
     clearInterval (timeControl); 
     actionFunction(); 
    } 
} 

ответ

2

Переменная timeControl является локальным для каждого вызова функции waitForKeyElements() - то есть timeControl установить не будет timeControl вам ясно. Другими словами, таймер, который вы начали с setInterval, никогда не будет очищен.

Перемещение его вне функции должно решить проблему.

т.е.

var timeControl = -1; 

function waitForKeyElements (selectorTxt, actionFunction) { 
    if (getElementByXPath(selectorTxt) == null) { 
     timeControl = setInterval (function() { 
        waitForKeyElements (selectorTxt, actionFunction); 
       }, 
       300 
      ); 
    } else { 
     if(timeControl !== -1) clearInterval (timeControl); 
     actionFunction(); 
    } 
} 

Кроме того, как пользователь указал, Prinzhorn в комментарии, запуск таймера с setInterval в каждом вызове обязан быть трудным. Вы должны действительно просто делать setTimeout, чтобы вещи не выходили из-под контроля.

+2

Он мог просто использовать 'setTimeout'. Не нужно очищать. – Prinzhorn

+0

@Prinzhorn - Да, очень актуальная точка. – techfoobar

+0

Не нужно инициализировать 'timeControl' как' -1', ни 'if (timeControl! == -1)'. Он будет «терпеть неудачу» молча, когда пройдет недопустимое значение – Ian

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