Come terminare lo script in JavaScript?


149

Come posso uscire dallo script JavaScript in modo simile a PHP exito die? So che non è la migliore pratica di programmazione ma ne ho bisogno.


1
Pensi di poter espandere questo requisito, esattamente perché stai cercando di raggiungere questo obiettivo?
Andynormancx,

8
@andynormancx, può essere utile per il debug.
SET

3
solo return;potrebbe essere sufficiente a seconda delle esigenze, si comporta come die () senza parametri.
Ishikawa,

2
Se "ne hai bisogno", è meglio ripensare il tuo design.
Frungi,

18
perché è sempre la prima domanda "perché"?
john ktejik,

Risposte:


80

Equivalente JavaScript per PHPdie . A proposito, chiama exit()(grazie splattne):

function exit( status ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: Paul
    // +   bugfixed by: Hyam Singer (http://www.impact-computing.com/)
    // +   improved by: Philip Peterson
    // +   bugfixed by: Brett Zamir (http://brettz9.blogspot.com)
    // %        note 1: Should be considered expirimental. Please comment on this function.
    // *     example 1: exit();
    // *     returns 1: null

    var i;

    if (typeof status === 'string') {
        alert(status);
    }

    window.addEventListener('error', function (e) {e.preventDefault();e.stopPropagation();}, false);

    var handlers = [
        'copy', 'cut', 'paste',
        'beforeunload', 'blur', 'change', 'click', 'contextmenu', 'dblclick', 'focus', 'keydown', 'keypress', 'keyup', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup', 'resize', 'scroll',
        'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument', 'DOMNodeInsertedIntoDocument', 'DOMAttrModified', 'DOMCharacterDataModified', 'DOMElementNameChanged', 'DOMAttributeNameChanged', 'DOMActivate', 'DOMFocusIn', 'DOMFocusOut', 'online', 'offline', 'textInput',
        'abort', 'close', 'dragdrop', 'load', 'paint', 'reset', 'select', 'submit', 'unload'
    ];

    function stopPropagation (e) {
        e.stopPropagation();
        // e.preventDefault(); // Stop for the form controls, etc., too?
    }
    for (i=0; i < handlers.length; i++) {
        window.addEventListener(handlers[i], function (e) {stopPropagation(e);}, true);
    }

    if (window.stop) {
        window.stop();
    }

    throw '';
}

1
Ecco il codice sorgente di uscita: kevin.vanzonneveld.net/techblog/article/…
splattne,

Quel codice non sembra fermare l'attivazione di eventi sugli elementi, ma solo gli eventi della finestra. Quindi dovresti anche scorrere tutti gli elementi della pagina facendo qualcosa di simile. Sembra tutto un requisito molto strano però.
Andynormancx,

2
l'intero concetto del dado è un po 'spezzato: il flusso dovrebbe essere in grado di gestire tutte le eventualità, che siano o meno tentativi di cattura.
annakata,

Penso che tu non abbia incluso tutti gli eventi che dovrebbero essere gestiti, come l'evento "selectstart".
Ono Oogami,

4
Non è possibile arrestare i gestori XMLHttpRequest. Il codice corrente non interrompe l'esecuzione di intervalli o timeout. Demo: jsfiddle.net/skibulk/wdxrtvus/1 Potresti considerarlo come una correzione:
stackoverflow.com/a/8860203/6465140

73

Le funzioni "exit" normalmente escono dal programma o dallo script insieme a un messaggio di errore come parametro. Ad esempio die (...) in php

die("sorry my fault, didn't mean to but now I am in byte nirvana")

L'equivalente in JS è di segnalare un errore con la parola chiave throw in questo modo:

throw new Error();

Puoi facilmente provare questo:

var m = 100;
throw '';
var x = 100;

x
>>>undefined
m
>>>100

46
@Sydwell: Se lo circondi con un blocco catch, verrà catturato e il programma non verrà terminato, sfidando il punto qui.
ultimo

4
Non dimenticare che puoi aggiungere un messaggio all'errore: genera un nuovo errore ('variabile =' + x); È un bel modo per terminare rapidamente uno script mentre ci stai lavorando e ottenere il valore di una variabile.
Andrew Swift,

1
@ultimate Penso che #Sydwell abbia intenzione di racchiudere l'intero script in try / catch, in modo da poter ottenere a) un'uscita pulita b) possibile messaggio di eccezione quando necessario :) Generare eccezioni non rilevate generalmente non porta nulla di buono :)
jave.web

47

Anche in programmi semplici senza handle, eventi e simili, è meglio mettere il codice in una funzione "principale", anche quando è l'unica procedura:

<script> 
function main()
{
//code

}
main();
</script>

In questo modo, quando si desidera interrompere il programma, è possibile utilizzare "return".


15

Se non ti interessa che sia un errore, scrivi:

fail;

Ciò impedirà al tuo codice principale (globale) di procedere. Utile per alcuni aspetti del debug / test.


1
window.failnon è definito nei browser attuali.
mikemaccana,

8
Questo è il punto - potresti anche fare mikeyMouse;- l'errore si risolverà. È veloce e sporco.
Marc

2
Ah, abbastanza giusto - forse aggiungilo alla tua risposta?
Mikemaccana,

13

Esistono molti modi per uscire da uno script JS o Node. Ecco i più rilevanti:

// This will never exit!
setInterval((function() {  
    return;
}), 5000);

// This will exit after 5 seconds, with signal 1
setTimeout((function() {  
    return process.exit(1);
}), 5000);

// This will also exit after 5 seconds, and print its (killed) PID
setTimeout((function() {  
    return process.kill(process.pid);
}), 5000);

// This will also exit after 5 seconds and create a core dump.
setTimeout((function() {  
    return process.abort();
}), 5000);

Se ti trovi in REPL (ovvero dopo aver eseguito nodesulla riga di comando), puoi digitare .exitper uscire.


Non volevo offendere l'intelligenza dei lettori spiegando un acronimo che si presenta come il primo risultato di Google. Ti suggerisco di non mescolare il codice JavaScript con i comandi REPL perché se un utente copia / incolla quel codice e lo esegue, otterrà un errore di sintassi sulla riga ".exit".
Dan Dascalescu,

6

Nel mio caso ho usato l' window.stopAPI che è come fare clic sul pulsante X sul browser:

window.stop();

5

Inserisci la debugger;parola chiave nel tuo codice JavaScript nel punto in cui desideri interrompere l'esecuzione. Quindi apri gli strumenti di sviluppo del tuo browser preferito e ricarica la pagina. Ora dovrebbe fermarsi automaticamente. Apri la sezione Sorgenti dei tuoi strumenti: la debugger;parola chiave è evidenziata e hai la possibilità di riprendere l'esecuzione dello script.

Spero possa essere d'aiuto.

Maggiori informazioni su:


2

Penso che questa domanda abbia avuto risposta, clicca qui per maggiori informazioni. Di seguito è la risposta breve che viene pubblicata.

throw new Error("Stop script");

Puoi anche usare il tuo browser per aggiungere punti di interruzione, ogni browser è simile, controlla le informazioni di seguito per il tuo browser.

Per informazioni sui punti di interruzione di Chrome, fare clic qui
Per informazioni sui punti di interruzione di Firefox, fare clic qui
Per informazioni sui punti di interruzione di Explorer, fare
clic su Informazioni sui punti di interruzione di Safari, fare clic qui


1

Se stai cercando un modo per terminare forzatamente l'esecuzione di tutto il Javascript su una pagina, non sono sicuro che ci sia un modo ufficialmente sanzionato per farlo - sembra il tipo di cosa che potrebbe essere un rischio per la sicurezza (anche se ad essere sincero, non riesco a pensare a come sarebbe fuori dalla mia testa). Normalmente in Javascript quando si desidera interrompere l'esecuzione del codice, returnè possibile eseguire qualsiasi funzione. (L' returnistruzione è facoltativa se è l'ultima cosa nella funzione e la funzione non deve restituire un valore) Se c'è qualche motivo per cui il ritorno non è abbastanza buono per te, probabilmente dovresti modificare più dettagli nella domanda sul perché pensi ne hai bisogno e forse qualcuno può offrire una soluzione alternativa.

In pratica, la maggior parte degli interpreti Javascript della maggior parte dei browser interromperà semplicemente l'esecuzione dello script corrente se riscontrano un errore. Quindi puoi fare qualcosa come accedere a un attributo di una variabile non impostata:

function exit() {
    p.blah();
}

e probabilmente interromperà la sceneggiatura. Ma non dovresti contare su questo perché non è affatto standard e sembra davvero una pratica terribile.

EDIT : OK, forse questa non è stata una buona risposta alla luce di Ólafur. Sebbene la die()funzione a cui ha collegato implementa sostanzialmente il mio secondo paragrafo, vale a dire che genera solo un errore.


1
Tutto ciò che farà fermerà l'attuale bit di scripting in esecuzione. Non impedirà a nuovi eventi di attivarsi e di eseguire nuovi bit di script.
Andynormancx,

Per non parlare, non è necessaria una funzione aggiuntiva per generare un errore. Javascript ha un'istruzione di lancio incorporata.
Chris,

La funzione die fa molto di più di p.blah (), scorre attraverso gli eventi di Windows e sostituisce le maniglie che hanno con "e.preventDefault (); e.stopPropagation ();", che interromperà l'attivazione degli eventi. Quindi genera un'eccezione.
Andynormancx,

1

gettare "";

È un uso improprio del concetto, ma probabilmente l'unica opzione. E, sì, dovrai ripristinare tutti i listener di eventi, proprio come menziona la risposta accettata. Avresti anche bisogno di un unico punto di accesso se ho ragione.

Per di più: vuoi una pagina che ti segnala via e-mail non appena viene lanciata - puoi usare ad esempio Raven / Sentry per questo. Ciò significa che ti produci falsi positivi. In tal caso, è inoltre necessario aggiornare il gestore predefinito per filtrare tali eventi o impostare tali eventi su Ignora sulla dashboard di Sentry.

window.stop ();

Questo non funziona durante il caricamento della pagina. Arresta anche la decodifica della pagina. Quindi non puoi davvero usarlo per offrire all'utente una variante senza javascript della tua pagina.

debugger;

Interrompe l'esecuzione solo con il debugger aperto. Funziona alla grande, ma non è disponibile.


1

In JavaScript ci sono molti modi, di seguito alcuni di essi

Metodo 1:

throw new Error("Something went badly wrong!");

Metodo 2:

return;

Metodo 3:

return false;

Metodo 4:

new new

Metodo 5:

scrivi la tua funzione personalizzata usa il metodo sopra e chiama dove ti serve

Nota: se si desidera solo mettere in pausa l'esecuzione del codice, è possibile utilizzare

debugger; 

0

Questa piccola funzione si avvicina molto a imitare l'uscita di PHP (). Come con le altre soluzioni, non aggiungere altro.

function exit(Msg)
    {
    Msg=Msg?'*** '+Msg:'';
    if (Msg) alert(Msg);
    throw new Error();
    } // exit

0

Basta creare una condizione BOOL, non è necessario un codice complicato qui.

Se anche una volta che lo trasformi in vero / o più volte, entrambi ti daranno una linea di soluzione / non multipla - sostanzialmente semplice.


0

Se si utilizza una funzione non definita nello script, lo script verrà interrotto a causa di "Uncaught ReferenceError". Ho provato seguendo il codice e le prime due righe eseguite.

Penso che questo sia il modo migliore per fermare la sceneggiatura. Se c'è un altro modo, per favore commentami. Voglio anche conoscere un altro modo migliore e semplice. A proposito, non ho ottenuto la funzione di uscita o die built in Javascript come PHP per terminare lo script. Se qualcuno lo sa, per favore fatemelo sapere.

alert('Hello');

document.write('Hello User!!!');

die();  //Uncaught ReferenceError: die is not defined

alert('bye');

document.write('Bye User!!!');

0

Se si desidera solo interrompere l'esecuzione di ulteriore codice senza "lanciare" alcun errore, è possibile sovrascrivere temporaneamente window.onerrorcome mostrato in cross-exit:

function exit(code) {
    const prevOnError = window.onerror
    window.onerror = () => {
        window.onerror = prevOnError
        return true
    }

    throw new Error(`Script termination with code ${code || 0}.`)
}

console.log("This message is logged.");
exit();
console.log("This message isn't logged.");

0

Sto usando iobroker e sono riuscito facilmente a fermare la sceneggiatura con

stopScript();

0

Non applicabile nella maggior parte dei casi, ma avevo un sacco di script asincroni in esecuzione nel browser e come un hack che faccio

window.reload();

per fermare tutto.


0

So che questo è vecchio, ma se vuoi una die()funzione PHP simile , potresti fare:

function die(reason) {
    throw new Error(reason);
}

Uso:

console.log("Hello");
die("Exiting script..."); // Kills script right here
console.log("World!");

L'esempio sopra stampa solo "Ciao".


-1

io uso questo pezzo di codice per fermare l'esecuzione:

throw new FatalError("!! Stop JS !!");

otterrai un errore della console, ma per me funziona bene.


-2

Questo è un esempio che, se esiste una condizione, termina lo script. Lo uso nel mio javascript lato client SSE, se il

<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>

non può essere analizzato direttamente dall'analisi JSON ...

if( ! SSE_HOST  ) throw new Error(['[!] SSE.js: ERR_NOHOST - finished !']);

... comunque l'idea generale è:

if( error==true) throw new Error([ 'You have This error' ,  'At this file', 'At this line'  ]);

questo terminerà / morirà il tuo script javasript


1
Questo non risponde davvero alla domanda. Stanno parlando di un problema generale, niente a che fare con le tue specifiche variabili / file SSE.
mjk,

1
mjk - meglio adesso?
Kapad,

-3

io uso la dichiarazione di ritorno invece di lanciare come lancio dà errore nella console. il modo migliore per farlo è controllare la condizione

if(condition){
 return //whatever you want to return
}

questo semplicemente interrompe l'esecuzione del programma da quella linea, invece di dare errori nella console.


1
Fornisce tuttavia l'errore nelle tue linters come "Impossibile utilizzare 'return' al di fuori della funzione"
Carles Alcolea,

Interrompe l'esecuzione perché l'istruzione non è valida. Puoi anche usare if (condition) { new new }o if (condition) { purpleMonkeyDishwasher(); }.
Coder
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.