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".
Perché escludere l'utilizzo di una bandiera? Sembra il posto perfetto per usarne uno. – nunespascal
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. –
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. –