Нет прямого способа «убить» запущенную функцию javascript.
Возможный обходной путь, хотя вам нужно заменить while(1)
цикл:
var i = 0; // for testing purposes
var toCall = "runInfinite()";
function runInfinite(){
// do stuff
console.log(i++);
setTimeout(function(){ eval(toCall); }, 100); // or whatever timeout you want
}
setTimeout(function(){ eval(toCall); }, 0); // start the function
setTimeout(function(){ toCall = ""; }, 5000); // "kill" the function
Я знаю, используя eval()
считается плохой практикой, однако эта идея должна быть ясна. Функция вызывает себя (не рекурсивная, поэтому setTimeout()
) с использованием переменной toCall
. Как только эта переменная не установлена, вы ее убьете извне.
Вы можете обернуть эти переменные и функции в класс, чтобы вы могли реализовать свою функцию «убить».
Почему вы исключаете использование флага? Кажется, это идеальное место для использования. – nunespascal
AFAIK, блок 'while (1)' буквально блокирует поток и не позволяет запускать что-либо еще. У меня нет источников, кроме опыта. (или, может быть, он становится настолько медленным, что доходит до эффективного замораживания). Если бы у меня была документация, я бы опубликовал ее как ответ. –
JavaScript (в браузерах) однопоточный, поэтому цикл while _actually_ блокирует поток; и у вас нет другого потока, который вы могли бы использовать для опроса/установки флага. –