Comment terminer le script en JavaScript?

149

Comment puis-je quitter le script JavaScript comme celui de PHP exitou die? Je sais que ce n'est pas la meilleure pratique de programmation, mais j'en ai besoin.

Nir
la source
1
Pensez-vous que vous pourriez développer cette exigence, pourquoi essayez-vous d'y parvenir?
andynormancx
8
@andynormancx, cela peut être pratique pour le débogage.
SET
3
tout return;pourrait être suffisant en fonction de vos besoins, agit comme matrice () sans paramètre.
Ishikawa
2
Si vous en «avez besoin», vous feriez peut-être mieux de repenser votre conception.
Frungi
18
pourquoi la première question est-elle toujours «pourquoi»?
john ktejik

Réponses:

80

Équivalent JavaScript pour PHPdie . BTW il appelle juste exit()(merci 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 '';
}
Ólafur Waage
la source
1
Voici le code source de la sortie: kevin.vanzonneveld.net/techblog/article/…
splattne
Ce code ne semble pas empêcher les événements sur les éléments de se déclencher, juste les événements de la fenêtre. Vous devez donc également parcourir tous les éléments de la page en faisant quelque chose de similaire. Cependant, tout cela semble être une exigence très étrange.
andynormancx
2
tout le concept de la matrice est un peu cassé - le flux devrait être capable de gérer toutes les éventualités, que celles-ci requièrent un essai ou non.
annakata
Je pense que vous n'avez pas inclus tous les événements qui devraient être gérés, tels que l'événement "selectstart".
Ono Oogami
4
Vous ne pouvez pas arrêter les gestionnaires XMLHttpRequest. Le code actuel n'interrompt pas l'exécution des intervalles ou des délais. Démo: jsfiddle.net/skibulk/wdxrtvus/1 Vous pourriez considérer cela comme une solution: stackoverflow.com/a/8860203/6465140
skibulk
73

Les fonctions "exit" quittent généralement le programme ou le script avec un message d'erreur en tant que paramètre. Par exemple die (...) en php

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

L'équivalent dans JS est de signaler une erreur avec le mot clé throw comme ceci:

throw new Error();

Vous pouvez facilement tester ceci:

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

x
>>>undefined
m
>>>100
Lorenz Lo Sauer
la source
46
@Sydwell: Si vous l'entourez d'un bloc catch, il sera capturé et le programme ne se terminera pas, défiant le point ici.
ultime
4
N'oubliez pas que vous pouvez ajouter un message à l'erreur: throw new Error ('variable =' + x); C'est un bon moyen de terminer rapidement un script pendant que vous travaillez dessus et d'obtenir la valeur d'une variable.
Andrew Swift
1
@ultimate Je pense que #Sydwell ment pour envelopper tout le script dans try / catch, afin que vous puissiez obtenir a) une sortie propre b) un message d'exception possible si nécessaire :) Lancer des exceptions non pensées n'apporte généralement rien de bon :)
jave.web
47

Même dans les programmes simples sans poignées, événements et autres, il est préférable de mettre du code dans une fonction "principale", même si c'est la seule procédure:

<script> 
function main()
{
//code

}
main();
</script>

De cette façon, lorsque vous souhaitez arrêter le programme, vous pouvez utiliser "return".

Jhep
la source
15

Si vous ne vous souciez pas que ce soit une erreur, écrivez simplement:

fail;

Cela empêchera votre code principal (global) de continuer. Utile pour certains aspects du débogage / test.

Marc
la source
1
window.failn'est pas défini dans les navigateurs actuels.
mikemaccana
8
C'est le point - vous pouvez également le faire mikeyMouse;- l'erreur se terminera. C'est rapide et sale.
Marc
2
Ah assez juste - peut-être ajouter cela à votre réponse?
mikemaccana
13

Il existe de nombreuses façons de quitter un script JS ou Node. Voici les plus pertinents:

// 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);

Si vous êtes dans le REPL (c'est-à-dire après avoir exécuté nodesur la ligne de commande), vous pouvez taper .exitpour quitter.

not2qubit
la source
Je ne voulais pas insulter l'intelligence des lecteurs en expliquant un acronyme qui apparaît comme le premier résultat de Google. Je vous suggère de ne pas mélanger le code JavaScript avec les commandes REPL car si un utilisateur copie / colle ce bloc de code et l'exécute, il recevra une erreur de syntaxe sur la ligne ".exit".
Dan Dascalescu
6

Dans mon cas, j'ai utilisé l' window.stopAPI, ce qui revient à cliquer sur le bouton X de votre navigateur:

window.stop();
Musa
la source
5

Placez le debugger;mot - clé dans votre code JavaScript à l'endroit où vous souhaitez arrêter l'exécution. Ensuite, ouvrez les outils de développement de votre navigateur préféré et rechargez la page. Maintenant, il devrait s'arrêter automatiquement. Ouvrez la section Sources de vos outils: ledebugger; mot-clé est mis en surbrillance et vous avez la possibilité de reprendre l'exécution du script.

J'espère que cela aide.

Plus d'informations à:

ci-dessous
la source
2

Je pense que cette question a été répondue, cliquez ici pour plus d'informations. Vous trouverez ci-dessous la réponse courte qui est publiée.

throw new Error("Stop script");

Vous pouvez également utiliser votre navigateur pour ajouter des points d'arrêt, chaque navigateur est similaire, vérifiez les informations ci-dessous pour votre navigateur.

Pour les informations sur les points d'arrêt de Chrome, cliquez ici
Pour les informations sur les points de rupture de Firefox, cliquez ici
Pour les informations sur les points de rupture de l'Explorateur,
cliquez ici.

Alfmonc
la source
1

Si vous cherchez un moyen de mettre fin de force à l'exécution de tout Javascript sur une page, je ne suis pas sûr qu'il existe un moyen officiellement sanctionné de le faire - il semble que le genre de chose puisse constituer un risque pour la sécurité (bien que être honnête, je ne peux pas imaginer comment ce serait hors de ma tête). Normalement en Javascript, quand vous voulez que votre code s'arrête, vous venez returnde n'importe quelle fonction en cours d'exécution. (L' returninstruction est facultative si c'est la dernière chose de la fonction et que la fonction ne doit pas renvoyer de valeur) S'il y a une raison pour laquelle le retour n'est pas assez bon pour vous, vous devriez probablement modifier plus en détail la question pour savoir pourquoi vous pensez vous en avez besoin et peut-être que quelqu'un peut vous proposer une solution alternative.

Notez qu'en pratique, les interpréteurs Javascript de la plupart des navigateurs arrêteront simplement d'exécuter le script en cours s'ils rencontrent une erreur. Vous pouvez donc faire quelque chose comme accéder à un attribut d'une variable non définie:

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

et il abandonnera probablement le script. Mais vous ne devriez pas compter dessus car ce n'est pas du tout standard, et cela semble vraiment être une pratique terrible.

ÉDITER : OK, ce n'était peut-être pas une si bonne réponse à la lumière d'Ólafur. Bien que la die()fonction à laquelle il a lié implémente fondamentalement mon deuxième paragraphe, c'est-à-dire qu'elle génère simplement une erreur.

David Z
la source
1
Tout ce que cela fera arrêtera l'exécution actuelle du script. Cela n'empêchera pas les nouveaux événements de se déclencher et d'exécuter de nouveaux bits de script.
andynormancx
Sans oublier que vous n'avez pas besoin d'une fonction très mauvaise pour générer une erreur. Javascript a une instruction throw intégrée.
Chris
La fonction die fait beaucoup plus que votre p.blah (), elle parcourt les événements Windows et remplace les poignées qu'ils ont par "e.preventDefault (); e.stopPropagation ();", qui arrêtera le déclenchement des événements. Ensuite, il lève une exception.
andynormancx
1

jeter "";

Est une mauvaise utilisation du concept, mais probablement la seule option. Et, oui, vous devrez réinitialiser tous les écouteurs d'événements, comme le mentionne la réponse acceptée. Vous auriez également besoin d'un point d'entrée unique si j'ai raison.

En plus: vous voulez une page qui vous rapporte par e-mail dès qu'elle est lancée - vous pouvez utiliser par exemple Raven / Sentry pour cela. Mais cela signifie que vous vous produisez de faux positifs. Dans ce cas, vous devez également mettre à jour le gestionnaire par défaut pour filtrer ces événements ou définir ces événements sur ignorer sur le tableau de bord de Sentry.

window.stop ();

Cela ne fonctionne pas pendant le chargement de la page. Il arrête également le décodage de la page. Vous ne pouvez donc pas vraiment l'utiliser pour offrir à l'utilisateur une variante sans javascript de votre page.

débogueur;

Arrête l'exécution uniquement avec le débogueur ouvert. Fonctionne très bien, mais pas un livrable.

informatik-handwerk.de
la source
1

En JavaScript, plusieurs façons sont disponibles, ci-dessous en sont quelques-unes

Méthode 1:

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

Méthode 2:

return;

Méthode 3:

return false;

Méthode 4:

new new

Méthode 5:

écrivez votre fonction personnalisée utilisez la méthode ci-dessus et appelez là où vous en avez besoin

Remarque: si vous souhaitez simplement suspendre l'exécution du code, vous pouvez utiliser

debugger; 
Srikrushna
la source
0

Cette petite fonction est assez proche d'imiter la sortie de PHP (). Comme pour les autres solutions, n'ajoutez rien d'autre.

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

Créez simplement une condition BOOL, pas besoin de code compliqué ici.

Si même une fois que vous le mettez à vrai / ou plusieurs fois, cela vous donnera à la fois une ligne de solution / non plusieurs - fondamentalement simple comme ça.

moni
la source
0

Si vous utilisez une fonction non définie dans le script, le script s'arrêtera en raison de "Uncaught ReferenceError". J'ai essayé en suivant le code et les deux premières lignes exécutées.

Je pense que c'est la meilleure façon d'arrêter le script. S'il y a un autre moyen, veuillez me commenter. Je veux aussi connaître un autre moyen simple et meilleur. BTW, je n'ai pas eu de sortie ou de fonction intégrée en Javascript comme PHP pour terminer le script. Si quelqu'un sait, faites-le moi savoir.

alert('Hello');

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

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

alert('bye');

document.write('Bye User!!!');
npsingh
la source
0

Si vous souhaitez simplement empêcher l'exécution de code supplémentaire sans "lancer" d'erreur, vous pouvez temporairement remplacer window.onerrorcomme indiqué dans 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.");
Richie Bendall
la source
0

J'utilise iobroker et j'ai facilement réussi à arrêter le script avec

stopScript();
user13449123
la source
0

Non applicable dans la plupart des cas, mais j'avais beaucoup de scripts asynchrones en cours d'exécution dans le navigateur et en tant que hack je le fais

window.reload();

pour tout arrêter.

M3RS
la source
0

Je sais que c'est vieux, mais si vous voulez une die()fonction PHP similaire , vous pouvez faire:

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

Usage:

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

L'exemple ci-dessus n'imprimera que "Hello".

Nanoo
la source
-1

j'utilise ce morceau de code pour arrêter l'exécution:

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

vous obtiendrez cependant une erreur de console mais cela fonctionne bien pour moi.

John Smith
la source
-2

Voici un exemple qui, si une condition existe, met fin au script. J'utilise ceci dans mon javascript côté client SSE, si le

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

ne peut pas être analysé directement à partir de l'analyse JSON ...

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

... de toute façon l'idée générale est:

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

cela terminera / mourra votre script javasript

kapad
la source
1
Cela ne répond pas vraiment à la question. Ils parlent d'un problème général, rien à voir avec vos variables / fichiers SSE spécifiques.
mjk
1
mjk - mieux maintenant?
kapad
-3

J'utilise l'instruction return au lieu de throw car throw donne une erreur dans la console. la meilleure façon de le faire est de vérifier l'état

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

cela arrête simplement l'exécution du programme à partir de cette ligne, au lieu de donner des erreurs dans la console.

iamsaurav
la source
1
Cependant, il donne l'erreur dans vos linters comme "Impossible d'utiliser 'return' en dehors de la fonction"
Carles Alcolea
Il arrête l'exécution car l'instruction n'est pas valide. Vous pouvez également utiliser if (condition) { new new }ou if (condition) { purpleMonkeyDishwasher(); }.
Coderer