2013-02-14 14 views
5

Come esempioUccidere una funzione JavaScript che viene eseguito infinita

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

setTimeout(runInfinite, 0); 

E 'possibile rompere questo modulo funzione runInfinite corsa infinita? Voglio dire è possibile uccidere questa funzione da un'altra funzione senza utilizzare un flag o dichiarazione di ritorno?

+1

Perché escludere l'utilizzo di una bandiera? Sembra il posto perfetto per usarne uno. – nunespascal

+2

AFAIK, il blocco 'while (1)' bloccherà letteralmente il thread e non permetterà a nessun altro di funzionare. Non ho fonti diverse dall'esperienza. (o forse diventa così lento che si tratta di un congelamento efficace) Se avessi documentazione, inserirò come risposta. –

+1

JavaScript (nei browser) è a thread singolo, quindi il ciclo while _actually_ blocca il thread; e non hai altra discussione che potresti usare per sondare/impostare la bandiera. –

risposta

5

La risposta è no. Dal momento che JavaScript è a thread singolo (a meno che non si utilizzi un'implementazione meno comune di cui dubito) nulla può interrompere un loop (o qualsiasi altro blocco di codice) dall'esterno.

+0

Bene, se la risposta è NO. Ciò significa che senza la dichiarazione "return" non è possibile. lascia pensare se restituisco se (isTimeoutFlag) restituisce; all'interno della funzione utente in fase di esecuzione .... questo potrebbe risolvere il mio problema? Cosa suggerisci? – Somnath

+0

Non lo farà. Perché allora dovresti essere in grado di impostare quel flag su 'true' che non puoi fare, perché JavaScript è a thread singolo (a meno che tu non aggiunga questo codice allo script dell'utente, che potresti trovare piuttosto difficile). :) Suggerisco di non farlo affatto - trovare un altro modo senza consentire agli utenti di scrivere script. – freakish

+0

Lo scaverò fuori. Fatti conoscere ragazzi .. – Somnath

1

Ho appena provato sul mio browser.

AFAIK, il blocco while (1) bloccherà letteralmente il thread e non consentirà l'esecuzione di altro. Non ho fonti diverse dall'esperienza, ma l'uso del toolkit di Chrome Developer ctrl+shift+i digitando while(1){} bloccherà tutto il resto a causa del fatto che browser-javascript è a thread singolo.

Tuttavia, se si utilizza node.js, è possibile che abbia le funzionalità di multithreading. Se qualcuno ha già familiarità con node.js ed è disposto a rispondere/modificare, provaci. Non l'ho mai usato del tutto.

+0

In realtà NodeJS è anche single-threaded (e non esiste una capacità di multithreading) poiché è basato sul V8, lo stesso motore JavaScript di Chrome. – freakish

+0

http://stackoverflow.com/questions/5200821/grasping-the-node-js-alternative-to-multithreading Apparentemente può supportare tecniche di multithreading sebbene sia –

+1

no. Il motore stesso utilizza thread. Ma ciò non significa che i thread siano disponibili per un programmatore NodeJS. – freakish

1

Il whay che non vuoi davvero. Ma forse stai sbagliando. Cercate di non usare while(1) se possibile, e alla fine della funzione chiamare di nuovo la funzione se il flag di fuori attivato ma alcuni pulsante di pausa non è impostato, o restituire se altrimenti

0

ritorno può essere utilizzato per fermare una funzione da la sua esecuzione attuale ma non nel tuo caso.

Nel tuo caso puoi provare a svolgere la tua funzione in un blocco try/catch , lo puoi scoprire quando la tua funzione diventerà infinita, in base a ciò puoi interrompere l'esecuzione corrente.

+0

consente di pensare di avere una serie di funzioni fornite dagli utenti. Li eseguo uno dopo l'altro. Il problema è che non posso chiedere agli utenti di mettere una bandiera all'interno della loro funzione. Mi stai dicendo di inserire codice per time-out-rule all'interno della funzione degli utenti? – Somnath

+0

Non ho trovato alcuna eccezione nella funzione sopra. In che modo try/catch block ti aiuterà? Non ho capito bene! – Somnath

2

Non esiste un modo diretto per "uccidere" una funzione javascript in esecuzione.

soluzione possibile, anche se è necessario sostituire il while(1) ciclo:

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 

So utilizzando eval() è considerato cattiva pratica, tuttavia l'idea dovrebbe essere chiaro. La funzione chiama se stessa (non ricorsiva, quindi setTimeout()) utilizzando la variabile toCall. Una volta disinserita questa variabile, la uccidi dall'esterno.

È possibile racchiudere queste variabili e funzioni in una classe in modo da poter implementare la funzione "kill".

Problemi correlati