Вопрос

Как я могу выйти из скрипта JavaScript, очень похожего на PHP exit или die?Я знаю, что это не лучшая практика программирования, но мне это нужно.

Это было полезно?

Решение

Эквивалент JavaScript для PHP die.Кстати, это просто вызывает exit() (спасибо, сплаттне):

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" обычно завершают работу программы или скрипта вместе с сообщением об ошибке в качестве параметра.Например, die(...) в 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 или Node.Вот наиболее актуальные:

// 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; ключевое слово выделено, и у вас есть возможность возобновить выполнение скрипта.

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

Более подробная информация на:

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

window.stop();

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

Живой пример простого решения здесь: https://jsfiddle.net/alignedfibers/cpe1o1yy/66/

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

Выше приведен "CallRunner", который предоставляет очень простой способ бесплатного выхода, просто передав вашу функцию исполнителю.

Именование переменной в скрипте может сбивать с толку, функция с именем "fun" - это имя, используемое в safetyRun для ссылки на функцию, которую мы пытаемся завершить, а exitErr - это имя, используемое для ссылки на функцию, которую мы запускаем для фактического завершения выхода.Также немного сбивает с толку это:как только exitErr завершается, фрейм стека все еще не освобождается из потока управления, который вызвал функцию, из которой мы вышли.Поскольку у нас все еще есть поток управления, мы можем использовать функции или коды ошибок, помещенные в массив в функции exitErr, и вызывать их последовательно перед возвратом, чтобы разрешить запуск любых других функций.Это позволяет нам изменять любые веса, вносить исправления или устанавливать любое необходимое состояние, которое мы можем использовать для предупреждения о том, какие состояния исправления ошибок требуют внимания, отправки отчета журнала или даже завершения сложной очистки, а также автономно исправлять функцию в фоновом режиме и, соответственно, вызывать exitErr до тех пор, пока она не завершит возврат вместо броска, что позволит функции, которую мы пытаемся завершить досрочно, завершиться (рекомендуем делать это вне основного потока).Эта "оболочка / жгут" может быть хорошим способом проверки версий браузера и прочего в начале функции, вы могли бы даже выполнить статический или динамический импорт здесь, если вы управляете своими собственными библиотеками или чем-либо еще, что вы действительно можете придумать.Exit - это только одна базовая функция, которую можно сделать доступной для вашей функции, обернув ее следующим образом.

Код в скрипке немного грязный и некрасивый, новые конструкции es6 могут сделать это красивее.Кроме того, я рекомендую вам вызвать генератор жгутов в верхней части этой функции и присвоить его результат локальному var, чтобы функция, которую вы хотите завершить, могла больше походить на приведенный ниже код.Чтобы сохранить поток управления, не освобождая стек, вам все равно понадобится жгут.run(функция(жгут){/MyVanillaFunc Мываниллафункция/}) чтобы обернуть вашу функцию vanilla, в противном случае приведенное ниже теоретически должно сработать.Перенос - это именно то, что я сделал в приведенном выше коде exitEarly.

var rockStarFunction = new function (){
var harness = reducePublicStrapOnFromCache()._url(location);
return function(){ /*wrapper would wrap these internals*/
        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 большинства браузеров просто прекращают выполнение текущего скрипта, если они обнаруживают ошибку.Таким образом, вы можете сделать что-то вроде доступа к атрибуту ненастроенной переменной:

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

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

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

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

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

Эта маленькая функция довольно близка к имитации PHP exit().Как и в случае с другими решениями, больше ничего не добавляйте.

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

Просто создайте условие BOOL , здесь нет необходимости в сложном коде..

Если даже один раз вы включите его в true / или несколько раз, это даст вам одну строку решения, а не несколько - в принципе, все просто.

бросок "";

Это неправильное использование концепции, но, вероятно, единственный вариант.И, да, вам придется сбросить все прослушиватели событий, точно так же, как указано в принятом ответе.Вам также понадобится единая точка входа, если я прав.

На самом верху этого:Вам нужна страница, которая будет отправлять вам отчеты по электронной почте сразу после запуска - вы можете использовать для этого, например, Raven / Sentry.Но это означает, что вы сами создаете ложноположительные результаты.В таком случае вам также необходимо обновить обработчик по умолчанию, чтобы отфильтровать такие события или установить для таких событий значение игнорировать на панели мониторинга Sentry.

окно.стоп();

Это не работает во время загрузки страницы.Это также останавливает декодирование страницы.Таким образом, вы не можете на самом деле использовать его, чтобы предложить пользователю вариант вашей страницы без javascript.

отладчик;

Останавливает выполнение только при открытом отладчике.Работает отлично, но не является результатом.

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

throw new Error("Stop script");

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

Для получения информации о точках останова Chrome нажмите здесь
Для получения информации о точках останова Firefox нажмите здесь
Для получения информации о точках останова проводника щелчок
Для получения информации о точках останова Safari нажмите здесь

Если вы используете какую-либо неопределенную функцию в скрипте, то скрипт остановится из-за "Неперехваченной ошибки ссылки".Я попробовал, выполнив следующий код и первые две строки.

Я думаю, это лучший способ остановить сценарий.Если есть какой-либо другой способ, то, пожалуйста, прокомментируйте меня.Я также хочу знать другой лучший и простой способ.Кстати, я не получил встроенную функцию exit или die в Javascript, такую как PHP, для завершения скрипта.Если кто-нибудь знает, пожалуйста, дайте мне знать.

alert('Hello');

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

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

alert('bye');

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

Это пример того, что, если условие существует, то завершите сценарий.Я использую это в моем 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top