web-dev-qa-db-fra.com

Comment terminer le script en Javascript

J'ai besoin d'un code qui quittera le script js, un peu comme PHP 'exit' ou 'die' .

109
Nir

Équivalent JavaScript pour die de PHP . En passant, il appelle simplement 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 '';
}
69
Ólafur Waage

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 en 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
55
Lorenz Lo Sauer

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

<script> 
function main()
{
//code

}
main();
</script>

De cette façon, quand vous voulez arrêter le programme, vous pouvez utiliser "retour".

40
Jhep

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

// 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é node sur la ligne de commande), vous pouvez taper .exit pour quitter.

8
not2qubit

Si cela ne vous dérange 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.

4
Marc

Placez le mot clé debugger; dans votre code JavaScript à l'endroit où vous souhaitez arrêter l'exécution. Ouvrez ensuite les outils de développement de votre navigateur favori et rechargez la page. Maintenant, il devrait faire une pause automatiquement. Ouvrez la section Sources de vos outils: le mot clé debugger; est mis en évidence et vous avez la possibilité de reprendre l'exécution du script.

J'espère que ça aide.

Plus d'informations à:

2
rbelow

Cette réponse fournit des détails illustrant un cadre supplémentaire permettant de résoudre ce problème, ainsi que d’autres besoins en matière de sortie anticipée, d’exceptions, de contrôle de processus et de gestion de fonctions séquentielles dans des scripts javas modulaires. La solution fournit des exemples de fermeture. Cette réponse suppose que l'individu souhaite que les autres scripts de la page continuent de s'exécuter une fois le script en question terminé. 

Exemple en direct de solution simple ici: https://codepen.io/corpus_khu/pen/VpMQzO

<script>
    var safetyRun = (function(){
      var curExecution = null;
      var exceptionHandlers = {
        cleanup:function(){
          /*do exit cleanup*/
          console.log("Cleanup could set straglers to {}");
          return;
        }
      }
      var exitErr = function(errcode){
        curExecution.exNames.Push("cleanup");
        throw new Error("EarlyExit");
      }
        var run = function(fun){
          curExecution = this;
          curExecution.exNames = [];
          fun(exitErr);
          for ( x in exNames){
            exceptionHandlers[x]();
          }
          return;
        }
        return run;
    })();
    var exitThisScript = function(exit){
      //write some modular code
      console.log("before exit");
      exit();
      console.log("after exit");
      return;
    }
    safetyRun(exitThisScript);
</script>

Ci-dessus est un moyen très simple de sortir. Avant d’envoyer votre fonction à ce "Runner", je vous recommande d’envelopper votre fonction dans un harnais de test en encapsulant un objet qui charge un harnais et peut être exécutée. Le harnais de test doit exposer des méthodes telles que exit () à votre fonction être passé. 

Des exemples de tout ce dont vous avez besoin pour construire une bonne stratégie de sortie sont disponibles sur github ici (fichier: pseudo_threads2.js): https://github.com/fromSpace/js-recursionwithevents-practice

Voir la version de démonstration ici: https://fromspace.github.io/js-recursionwithevents-practice/

Notez dans pseudo_threads2.js que la fonction simConstantMomentum () renvoie une fonction qui a des vars de portée lexicale avec toutes les fonctions de harnais. Au lieu de cela, je vous recommande d'appeler un générateur de harnais en haut de cette fonction et d'assigner son résultat à une variable locale afin que la fonction que vous voulez quitter ressemble davantage à ceci lorsque vous avez terminé.

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){
        harness.scriptContextChangeEvent();
        harness.imInteligentFunction("{slib_err-15346 : 'Cannot handle request, ::suggest(mesh//abc) exit back to pool'}");
        harness.exit();
        console.log("You should never get this far");
        return true;
    };
}

La solution que j’ai fournie ici est celle que je recommande si vous avez l’intention de créer un conteneur javascript runner doté de fonctionnalités telles que exit, assert, mock, etc., car je pense que c’est le meilleur moyen de créer ce conteneur et de fonctions transmissibles. - corpus_khu

1
alignedFiberS

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

Si même une fois que vous le réglez sur true/ou plusieurs fois, , Il vous donnera à la fois une ligne de solution/non plusieurs - Fondamentalement aussi simple que cela.

0
moni

Si vous utilisez une fonction non définie dans le script, le script s'arrête 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 le meilleur moyen d'arrêter le script. S'il y a un autre moyen, alors commentez-moi. Je veux aussi connaître un autre moyen simple et optimal. BTW, je n'ai pas obtenu de quitter ou de mourir fonction intégrée dans Javascript comme PHP pour terminer le script. Si quelqu'un sait alors s'il vous plaît faites le moi savoir.

alert('Hello');

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

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

alert('bye');

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

Je pense que cette question a reçu une réponse, cliquez ici pour plus d'informations. Vous trouverez ci-dessous la réponse brève affichée.

throw new Error("Stop script");

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

Pour Chrome info sur les points d'arrêt, cliquez ici
Pour plus d'informations sur les points d'arrêt de Firefox, cliquez ici
Pour les informations sur les points d'arrêt de l'explorateur click
Pour les informations sur les points d'arrêt Safari, cliquez ici

0
alfmonc

Cette petite fonction est assez proche de l’impression de 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
0
David Spector

jeter "";

Est-ce un abus 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 aurez également besoin d’un point d’entrée unique si j’ai raison.

Sur le dessus: vous voulez une page qui vous rapporte par email dès son lancement - vous pouvez utiliser par exemple Raven/Sentry pour cela. Mais cela signifie que vous produisez vous-même des faux positifs. Dans ce cas, vous devez également mettre à jour le gestionnaire par défaut pour filtrer ces événements ou définir de tels événements sur ignore dans 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 de votre page sans javascript.

débogueur;

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

UPDATE: Cela fonctionne tant que vous ne le catch pas!

throw window.location.assign('dead.html');
0
Dylan Sharhon

Si vous cherchez un moyen de mettre fin de force à l'exécution de tout le code JavaScript d'une page, je ne suis pas sûr qu'il existe un moyen officiellement autorisé de le faire - cela semble être le genre de chose qui pourrait constituer un risque pour la sécurité (bien que Soyons honnêtes, je ne vois pas comment ça se passerait par la tête). Normalement en Javascript, lorsque vous voulez que votre code cesse de fonctionner, il vous suffit de return à partir de la fonction en cours d'exécution. (L'instruction return est facultative si c'est la dernière chose dans la fonction et que la fonction ne doit pas renvoyer de valeur) S'il y a une raison qui ne vous convient pas, renvoyer plus de détails dans la question de savoir pourquoi pense que vous en avez besoin et peut-être que quelqu'un peut offrir une solution alternative.

Notez qu'en pratique, les interprètes Javascript de la plupart des navigateurs arrêteront simplement d'exécuter le script actuel 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 probablement interrompra le script. Mais vous ne devriez pas compter sur cela parce que ce n'est pas du tout standard et cela semble vraiment une pratique terrible.

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

0
David Z

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

window.stop();
0
Musa