2013-01-12 35 views
7

Sytuacja:Jak ograniczyć czas wykonywania funkcji w javascript?

Użytkownik pisze jakiś kod js i powinien być uruchamiany na niektórych danych (lokalnie).

Ale czasami są nieskończone pętle lub rekursywne wywołania ... Dlatego muszę ograniczyć czas wykonania funkcji, ale nie edytować samej funkcji (a nawet jeśli tak - czy powinienem wstawiać sprawdzenia po każdym punkcie sekwencji? o rekurencyjnych wywołaniach?)

Czy są jakieś inne rozwiązania tego dziwnego problemu? Może eval może dać kilka parse tree kodu lub coś podobnego?

+0

Czy istnieje powód, dla którego wolisz próbować przerwać egzekucję, aby po prostu uniknąć nieskończonych pętli/rekursji? –

+0

Kiedy mówisz, że działa lokalnie na niektórych danych, masz na myśli maszynę użytkownika lub lokalnie na jakimś serwerze pod twoją kontrolą. Jeśli to drugie, czy działa to w środowisku podobnym do Node.js? – DWright

+0

Powodem jest to, że skrypt wykonuje kod użytkownika, a nie mój – user1431314

Odpowiedz

2

Czy jest to w przeglądarce lub w węźle?

W przeglądarce można umieścić swój kod w 0 sekundy setTimeout aby uwolnić się z pętli biegu (i odblokować przeglądarkę tymczasowo)

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

węzeł ma coś hodowcy, który wygląda tak i jest nieco lepiej :

process.nextTick(function() { 
    // frees up the run loop even faster 
}); 
5

Możliwe rozwiązanie to użycie Web Workers. Robot sieciowy jest uruchamiany w osobnym wątku i można go zakończyć.

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

Minusem jest to, że pracownicy sieci Web to not all browsers support.

+1

Również pracownicy sieci Web nie mogą uzyskać dostępu do elementów DOM. To może być problem, zwłaszcza, że ​​podobno jest to nieznany kod. –

+0

Uwaga: Jak zwykle wątki tła - w tym pracownicy - nie mogą manipulować DOM. Jeśli działania podejmowane przez wątek w tle muszą spowodować zmiany w DOM, powinny wysyłać wiadomości do ich twórców, aby to zrobić. – asgoth