Как завершить работу скрипта в Javascript
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"обычно выходят из программы или скрипта вместе с сообщением об ошибке в качестве параметра. Например 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 или узла. Вот самые актуальные:
// 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;
ключевое слово выделено, и у вас есть возможность возобновить выполнение сценария.
надеюсь, это поможет.
больше информации at:
этот ответ предоставляет подробную информацию, демонстрирующую дополнительную структуру, которая поможет решить этот и другие ранний выход, исключения, управление процессом и последовательную обработку функций в модульных 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.Яш): 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 и такие встроенные. Я думаю, что это лучший способ построить этот контейнер и сделать мои функции передаваемыми. -- corpus_khu
если вы ищете способ принудительно прекратить выполнение всего Javascript на странице, Я не уверен, что есть официально санкционированный способ сделать это - это похоже на то, что может быть риском для безопасности (хотя, честно говоря, я не могу думать о том, как это было бы с моей головы). Обычно в Javascript, когда вы хотите, чтобы ваш код перестал работать, вы просто return
из любой выполняемой функции. (The return
оператор является необязательным, если это последнее в функция и функция не должны возвращать значение) если по какой-то причине возврат недостаточно хорош для вас, вы, вероятно, должны отредактировать более подробную информацию о том, почему вы думаете, что вам это нужно, и, возможно, кто-то может предложить альтернативное решение.
обратите внимание, что на практике интерпретаторы Javascript большинства браузеров просто перестанут запускать текущий скрипт, если они столкнутся с ошибкой. Таким образом, вы можете сделать что-то вроде доступа к атрибуту unset переменная:
function exit() {
p.blah();
}
и это наверное прервать сценарий. Но вы не должны рассчитывать на это, потому что это совсем не стандартно, и это действительно кажется ужасной практикой.
редактировать: хорошо, может быть, это был не такой хороший ответ в свете Олафура. Хотя ... --3--> функция, с которой он связан, в основном реализует мой второй абзац, т. е. он просто выдает ошибку.
в моем случае я использовал окно.остановите API, который похож на нажатие кнопки X в вашем браузере:
см.:https://developer.mozilla.org/en/docs/Web/API/Window/stop
Это пример того, что, если условие существует, завершите сценарий. Я использую это в своем клиентском javascript SSE, если
<script src="sse-clint.js" host="https://sse.host" query='["q1,"q2"]' ></script>
canot анализируется прямо из 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