Как ограничить время выполнения функции в JavaScript?

Ситуация такова:

Пользователь пишет некоторый js-код, и он должен быть запущен на некоторых данных (локально).

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

Есть ли другие решения этой странной проблемы? Может быть, eval может дать какое-то дерево разбора кода или что-то в этом роде?

2 ответа

Возможным решением является использование веб-работников. Веб-работник запускается в отдельном потоке и может быть прерван.

var worker = new Worker('my_task.js');
...
worker.terminate();

Недостатком является то, что не все браузеры поддерживают Web Workers.

Это в браузере или в узле?

В браузере вы можете поместить свой код в 0 секунд setTimeout освободить цикл выполнения (и временно разблокировать браузер)

setTimeout(function() {
   // your code here
}, 0)

у узла есть что-то более причудливое, похожее на это, и немного лучше:

process.nextTick(function() {
   // frees up the run loop even faster
});
Другие вопросы по тегам