Как завершить скрипт в Javascript



Мне нужен код, который выйдет из JS-скрипта так же, как PHP "exit" или "die".
(Я знаю, что это не лучшая практика программирования, но мне это нужно).

563   11  

11 ответов:

эквивалент JavaScript для PHP die. Кстати он просто звонит exit() (спасибо 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 '';
}

функции"exit" обычно выходят из программы или скрипта вместе с сообщением об ошибке в качестве параметра. Например умереть(...) в php

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

эквивалент в JS должен сигнализировать об ошибке с бросить ключевое слово вроде этого:

throw new Error();

вы можете легко проверить это:

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

x
>>>undefined
m
>>>100

даже в простых программах без дескрипторов, событий и тому подобного, лучше всего поместить код в" основную " функцию, даже если это единственная процедура:

<script> 
function main()
{
//code

}
main();
</script>

таким образом, когда вы хотите остановить программу, вы можете использовать "return".

здесь много способов для выхода из сценария JS или узла. Вот самые актуальные:

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

Если вы находитесь в REPL (т. е. после запуска node в командной строке), вы можете ввести .exit для выхода.

Если вам все равно, что это ошибка, просто напишите:

fail;

это остановит ваш основной (глобальный) код от продолжения. Полезно для некоторых аспектов отладки/тестирования.

место debugger; ключевое слово в коде JavaScript, где вы хотите остановить выполнение. Затем откройте инструменты разработчика вашего любимого браузера и перезагрузите страницу. Теперь он должен автоматически приостановиться. Откройте источник раздел ваших инструментов:debugger; ключевое слово выделено, и у вас есть возможность возобновить выполнение сценария.

Я надеюсь, что это помогает.

больше информации в:

этот ответ содержит подробные сведения, демонстрирующие дополнительную структуру, которая поможет решить этот и другие ранние выходы, исключения, управление процессом и последовательную обработку функций в модульных javascripts. Решение предоставляет примеры закрытия. Этот ответ предполагает, что пользователь хотел бы, чтобы другие сценарии на странице продолжали выполняться после выхода из рассматриваемого сценария.

живой пример простого решения здесь: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>

выше-это очень простой способ для выхода. Перед отправкой вашей функции в этот "бегун" я рекомендую обернуть вашу функцию в тестовый жгут, обернув объект, который загружает жгут и может быть выполнен, тестовый жгут должен предоставлять методы, такие как exit() для вашей функции, чтобы их не нужно было передавать.

примеры всего, что вам нужно для создания хорошей стратегии выхода, доступны на github здесь (файл: pseudo_threads2.js): https://github.com/fromSpace/js-recursionwithevents-practice

демо-версия здесь: https://fromspace.github.io/js-recursionwithevents-practice/

обратите внимание на pseudo_threads2.js что функция simConstantMomentum () возвращает функцию, которая имеет лексическую область vars со всеми функциями жгута проводов. Вместо этого я рекомендую вам вызвать генератор жгута проводов в верхней части этой функции и назначить его результат локальному var, чтобы функция, которую вы хотите выйти, выглядит более так, когда вы закончите.

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;
    };
}

решение, которое я предоставил здесь, я рекомендую, если ваше намерение состоит в том, чтобы построить контейнер JavaScript runner с такими возможностями, как exit, assert, mock и такие встроенные. Я думаю, что это лучший способ построить этот контейнер и сделать мои функции передаваемыми. -- корпус_ху

если вы ищете способ принудительно прекратить выполнение всего Javascript на странице, Я не уверен, что есть официально санкционированный способ сделать это - похоже, что это может быть угроза безопасности (хотя, честно говоря, я не могу думать о том, как это будет с моей головы). Обычно в Javascript, когда вы хотите, чтобы ваш код перестал работать, вы просто return из любой выполняемой функции. (Тег return оператор является необязательным, если это последнее, что функция и функция не должны возвращать значение) если есть какая-то причина, по которой возврат недостаточно хорош для вас, вы, вероятно, должны отредактировать более подробно вопрос о том, почему вы думаете, что вам это нужно, и, возможно, кто-то может предложить альтернативное решение.

обратите внимание, что на практике интерпретаторы Javascript большинства браузеров просто перестанут запускать текущий скрипт, если они столкнутся с ошибкой. Таким образом, вы можете сделать что-то вроде доступа к атрибуту unset переменная:

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

и это наверное прервать сценарий. Но вы не должны рассчитывать на это, потому что это совсем не стандарт, и это действительно кажется ужасной практикой.

EDIT: ОК, может, это не такой хороший ответ в свете Олафура по. Хотя die() функция, с которой он связан, в основном реализует мой второй абзац, т. е. он просто выдает ошибку.

в моем случае я использовал окно.остановите API, который похож на нажатие кнопки X в вашем браузере:

см.:https://developer.mozilla.org/en/docs/Web/API/Window/stop

обновление: это работает до тех пор, пока вы не catch его!

throw window.location.assign('dead.html');

Это пример того, что, если условие существует, то завершите сценарий. Я использую это в своем клиентском javascript SSE, если

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

не может быть проанализирован прямо из JSON parse ...

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

... во всяком случае, общая идея такова:

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

это завершит / умрет ваш скрипт javasript

Comments

    Ничего не найдено.