2013-01-12 12 views
7

La situazione è:Come limitare il tempo di esecuzione di una funzione in javascript?

L'utente scrive un po 'di codice js e dovrebbe essere eseguito su alcuni dati (localmente).

Ma a volte ci sono loop infiniti o chiamate ricorsive ... Ecco perché ho bisogno di limitare il tempo di esecuzione di una funzione ma non di modificare la funzione stessa (e anche se così - dovrei inserire dei controlli dopo ogni punto di sequenza? sulle chiamate ricorsive?)

Esistono altre soluzioni per questo strano problema? Forse la valutazione può dare qualche albero di analisi del codice o qualcosa del genere?

+0

C'è una ragione per cui preferisci provare ad abortire per evitare semplicemente loop infiniti/ricorsione? –

+0

Quando dici che viene eseguito su alcuni dati localmente, intendi sul computer dell'utente o localmente su qualche server sotto il tuo controllo. Se quest'ultimo è in esecuzione in qualcosa come l'ambiente Node.js? – DWright

+0

Il motivo è che lo script esegue il codice utente, non il mio – user1431314

risposta

2

È presente nel browser o nel nodo?

Nel browser si può mettere il codice in un 0 secondi setTimeout per liberare il ciclo di esecuzione (e sbloccare temporaneamente il navigatore)

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

nodo ha qualcosa più elaborato che assomiglia a questo ed è leggermente migliore :

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

Una possibile soluzione utilizza Web Workers. Un web worker viene avviato in un thread separato e può essere terminato.

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

Lato negativo è che i lavoratori Web not all browsers support.

+1

Anche i Web Worker non possono accedere agli elementi DOM. Questo potrebbe essere un problema, soprattutto perché apparentemente, questo è un codice sconosciuto. –

+0

Nota: come al solito, i thread in background, inclusi i worker, non possono manipolare il DOM. Se le azioni intraprese dal thread in background devono comportare modifiche al DOM, dovrebbero postare messaggi ai loro creatori per fare quel lavoro. – asgoth