2013-02-14 2 views
5

В качестве примераKilling функцию JavaScript, которая проходит бесконечное

var runInfinite = function(){ 
    while(1) 
    { 
     // Do stuff; 
    } 
}; 

setTimeout(runInfinite, 0); 

Можно ли разорвать эту функцию runInfinite форма работает бесконечен? Я имею в виду, можно ли убить эту функцию из другой функции без использования флага или оператора возврата?

+1

Почему вы исключаете использование флага? Кажется, это идеальное место для использования. – nunespascal

+2

AFAIK, блок 'while (1)' буквально блокирует поток и не позволяет запускать что-либо еще. У меня нет источников, кроме опыта. (или, может быть, он становится настолько медленным, что доходит до эффективного замораживания). Если бы у меня была документация, я бы опубликовал ее как ответ. –

+1

JavaScript (в браузерах) однопоточный, поэтому цикл while _actually_ блокирует поток; и у вас нет другого потока, который вы могли бы использовать для опроса/установки флага. –

ответ

5

Ответ отрицательный. Поскольку JavaScript является однопоточным (если вы не используете какую-то менее распространенную реализацию, которая, я сомневаюсь), ничто не может сломать цикл (или любой другой блок кода) извне.

+0

Хорошо, если ответ НЕТ. Это означает, что без выражения «return» это невозможно. давайте подумаем, если я приложу, если (isTimeoutFlag) return; внутри функции пользователя во время выполнения .... thats может исправить мою проблему? Что вы предлагаете? – Somnath

+0

Это не так. Потому что тогда вам нужно будет установить этот флаг в 'true', который вы не можете сделать, потому что JavaScript является однопоточным (если вы не добавите этот код в скрипт пользователя, что вам может показаться довольно трудным). :) Я предлагаю не делать этого вообще - найти другой способ, не позволяя пользователям писать скрипты. – freakish

+0

Я выкопаю его. Дайте вам знать, ребята .. – Somnath

1

Я только что проверил в своем браузере.

AFAIK, блок while (1) буквально блокирует поток и не позволяет запускать что-либо еще. У меня нет источников, отличных от опыта, но с помощью инструмента набора инструментов разработчика Chrome ctrl+shift+i ввод while(1){} блокирует все остальное из-за того, что браузер-javascript однопоточен.

Однако, если вы используете node.js, у вас может быть много возможностей для многопоточности. Если кто-то достаточно знаком с node.js и готов ответить/отредактировать, пойдите для него. Я никогда не использовал его.

+0

На самом деле NodeJS также имеет однопоточность (и нет многопотокового capablitiy), поскольку он построен на V8 - тот же движок JavaScript, что и в Chrome. – freakish

+0

http://stackoverflow.com/questions/5200821/grasping-the-node-js-alternative-to-multithreading По-видимому, он может поддерживать методы многопоточности, но –

+1

Нет. Сам двигатель использует потоки. Но это не значит, что потоки доступны для программиста NodeJS. – freakish

1

Честно говоря, вы не хотите. Но, возможно, вы делаете это неправильно. Старайтесь не использовать while(1), если это возможно, и в конце функции вызовите функцию снова, если внешний флаг срабатывает, но некоторые кнопки перерыва не установлены, или вернуться, если иное

0

возвращение может использоваться, чтобы остановить функцию от его текущее исполнение, но не в вашем случае.

В вашем случае вы можете попробовать, чтобы ваша функция была обернута в блок try/catch , вы можете узнать, когда ваша функция будет бесконечной, на основе которой вы можете прекратить ее выполнение.

+0

позволяет думать, что у меня есть набор функций, предоставляемых пользователями. Я запускаю их один за другим. Проблема в том, что я не могу попросить пользователей установить флаг внутри своей функции. Вы хотите, чтобы я вводил код для тайм-аута внутри функции пользователя? – Somnath

+0

Я не нашел никакого исключения в вышеупомянутой функции. Как поможет блок try/catch? Я смущен! – Somnath

2

Нет прямого способа «убить» запущенную функцию 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. Как только эта переменная не установлена, вы ее убьете извне.

Вы можете обернуть эти переменные и функции в класс, чтобы вы могли реализовать свою функцию «убить».

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