Como finalizar o script em JavaScript?

149

Como posso sair do script JavaScript como o PHP exitou die? Sei que não é a melhor prática de programação, mas preciso.

Nir
fonte
1
Você acha que poderia expandir esse requisito, exatamente por que está tentando alcançar isso?
andynormancx
8
@andynormancx, isso pode ser útil para depuração.
SET
3
apenas return;pode ser suficiente, dependendo de seus requisitos, age como die () sem parâmetros.
Ishikawa
2
Se você “precisar”, pode ser melhor repensar seu design.
Frungi
18
por que é sempre a primeira pergunta 'por que'?
21818 John Deere

Respostas:

80

JavaScript equivalente para PHPdie . Entre, basta chamar exit()(obrigado 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
fonte
1
Aqui está o código fonte de saída: kevin.vanzonneveld.net/techblog/article/...
splattne
Esse código não parece impedir que eventos em elementos sejam acionados, apenas os eventos da janela. Portanto, você também precisará percorrer todos os elementos da página, fazendo algo semelhante. Tudo isso parece um requisito muito estranho.
andynormancx
2
todo o conceito de molde está um pouco quebrado - o fluxo deve ser capaz de lidar com todas e quaisquer eventualidades, sejam elas necessárias ou não.
annakata
Acho que você não incluiu todos os eventos que devem ser tratados, como o evento "seleciona o início".
Ono Oogami 27/03
4
Você não pode parar os manipuladores XMLHttpRequest. O código atual não interrompe a execução de intervalos ou tempos limite. Demonstração: jsfiddle.net/skibulk/wdxrtvus/1 Você pode considerar isso como uma correção: stackoverflow.com/a/8860203/6465140
skibulk
73

As funções "exit" geralmente fecham o programa ou script junto com uma mensagem de erro como parâmetro. Por exemplo, morrer (...) em php

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

O equivalente em JS é sinalizar um erro com a palavra-chave throw assim:

throw new Error();

Você pode facilmente testar isso:

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

x
>>>undefined
m
>>>100
Lorenz Lo Sauer
fonte
46
@ Sydwell: Se você o cercar pelo bloco catch, ele será capturado e o programa não será encerrado, desafiando o ponto aqui.
final de
4
Não esqueça que você pode adicionar uma mensagem ao erro: lance novo Error ('variable =' + x); É uma ótima maneira de terminar rapidamente um script enquanto você trabalha nele e obter o valor de uma variável.
Andrew Swift
1
@ultimate Eu acho que #Sydwell mentiu para envolver todo o script em try / catch, para que você possa obter uma) saída limpa b) possível mensagem de exceção quando necessário :) Lançar exceções não solicitadas geralmente não traz nenhum benefício :)
jave.web
47

Mesmo em programas simples, sem identificadores, eventos e outros, é melhor colocar o código em uma função "principal", mesmo quando esse for o único procedimento:

<script> 
function main()
{
//code

}
main();
</script>

Dessa forma, quando você deseja interromper o programa, pode usar "return".

Jhep
fonte
15

Se você não se importa que seja um erro, basta escrever:

fail;

Isso impedirá que seu código principal (global) continue. Útil para alguns aspectos da depuração / teste.

Marc
fonte
1
window.failnão está definido nos navegadores atuais.
Mikemaccana 28/02/19
7
Esse é o ponto - você também pode fazer mikeyMouse;- o erro será encerrado. É rápido e sujo.
Marc
1
Ah, é justo - talvez acrescente isso à sua resposta?
Mikemaccana 7/03/19
13

Existem várias maneiras de sair de um script JS ou Node. Aqui estão os mais relevantes:

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

Se você estiver no REPL (ou seja, depois de executar nodena linha de comando), digite .exitpara sair.

not2qubit
fonte
Não queria insultar a inteligência dos leitores, explicando um acrônimo que aparece como o primeiro resultado do Google. Eu sugiro que você não misture o código JavaScript com os comandos REPL, porque se um usuário copiar / colar esse código e o executar, ele receberá um erro de sintaxe na linha ".exit".
Dan Dascalescu
6

No meu caso, usei a window.stopAPI, que é como clicar no botão X no seu navegador:

window.stop();
musa
fonte
5

Coloque a debugger;palavra - chave no seu código JavaScript onde deseja parar a execução. Em seguida, abra as ferramentas de desenvolvedor do seu navegador favorito e recarregue a página. Agora deve pausar automaticamente. Abra a seção Fontes de suas ferramentas: a debugger;palavra-chave é destacada e você tem a opção de retomar a execução do script.

Espero que ajude.

Mais informações em:

rbelow
fonte
2

Acho que esta pergunta foi respondida, clique aqui para obter mais informações. Abaixo está a resposta curta que é postada.

throw new Error("Stop script");

Você também pode usar seu navegador para adicionar pontos de interrupção; todos os navegadores são semelhantes; verifique as informações abaixo para o seu navegador.

Para obter informações sobre pontos de interrupção do Chrome, clique aqui
Para informações sobre pontos de interrupção do Firefox, clique aqui
Para informações sobre pontos de interrupção do Explorer, clique em
Para informações sobre pontos de interrupção do Safari, clique aqui

alfmonc
fonte
1

Se você está procurando uma maneira de terminar forçosamente a execução de todo o Javascript em uma página, não tenho certeza de que haja uma maneira oficialmente sancionada de fazer isso - parece o tipo de coisa que pode ser um risco à segurança (embora para ser honesto, não consigo pensar em como isso seria do alto da minha cabeça). Normalmente em Javascript, quando você deseja que seu código pare de ser executado, é necessário a returnpartir de qualquer função que esteja sendo executada. (A returndeclaração é opcional se for a última coisa na função e a função não devolver um valor) Se houver algum motivo pelo qual o retorno não seja bom o suficiente para você, você provavelmente deverá editar mais detalhes na pergunta sobre por que pensa você precisa e talvez alguém possa oferecer uma solução alternativa.

Observe que, na prática, os intérpretes Javascript da maioria dos navegadores simplesmente param de executar o script atual se encontrarem um erro. Portanto, você pode fazer algo como acessar um atributo de uma variável não definida:

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

e provavelmente abortará o script. Mas você não deve contar com isso porque não é de todo padrão e parece realmente uma prática terrível.

EDIT : OK, talvez essa não tenha sido uma resposta tão boa à luz da de Ólafur. Embora a die()função à qual ele se vinculou basicamente implemente meu segundo parágrafo, isto é, apenas gera um erro.

David Z
fonte
1
Tudo o que fará fará com que o bit de script atual em execução seja interrompido. Não impedirá que novos eventos disparem e executem novos bits de script.
andynormancx
Para não mencionar, você não precisa de uma função extra ruim para gerar um erro. Javascript possui uma declaração de lançamento interna.
1540 Chris
A função die faz muito mais do que o seu p.blah (), executa os eventos do Windows e substitui os identificadores que eles possuem por "e.preventDefault (); e.stopPropagation ();", o que interromperá o disparo dos eventos. Em seguida , lança uma exceção.
andynormancx
1

lançar "";

É um mau uso do conceito, mas provavelmente a única opção. E, sim, você precisará redefinir todos os ouvintes de eventos, assim como a resposta aceita. Você também precisaria de um único ponto de entrada se eu estiver certo.

No topo: Você deseja uma página que reporte por e-mail assim que for lançada - você pode usar, por exemplo, Raven / Sentry para isso. Mas isso significa que você se produz falsos positivos. Nesse caso, você também precisa atualizar o manipulador padrão para filtrar esses eventos ou definir esses eventos em ignorar no painel do Sentry.

window.stop ();

Isso não funciona durante o carregamento da página. Para a decodificação da página também. Portanto, você não pode realmente usá-lo para oferecer ao usuário uma variante sem javascript da sua página.

depurador;

Pára a execução apenas com o depurador aberto. Funciona muito bem, mas não é um produto final.

informatik-handwerk.de
fonte
1

No JavaScript, existem várias maneiras, abaixo estão algumas delas

Método 1:

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

Método 2:

return;

Método 3:

return false;

Método 4:

new new

Método 5:

escreva sua função personalizada, use o método acima e chame onde precisar

Nota: Se você quiser apenas pausar a execução do código, poderá usar

debugger; 
Srikrushna
fonte
0

Esta pequena função chega bem perto de imitar exit () do PHP. Como nas outras soluções, não adicione mais nada.

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

Basta criar uma condição BOOL, sem necessidade de código complicado aqui ..

Se mesmo depois de convertê-lo em true / ou várias vezes, ambos fornecerão uma linha de solução / não várias - basicamente simples assim.

moni
fonte
0

Se você usar alguma função indefinida no script, o script será interrompido devido a "Uncaught ReferenceError". Eu tentei seguindo o código e as duas primeiras linhas executadas.

Eu acho que essa é a melhor maneira de parar o script. Se houver outra maneira, por favor, comente-me. Eu também quero conhecer outra maneira melhor e mais simples. BTW, eu não obtive a saída ou a função embutida em Javascript como PHP para finalizar o script. Se alguém souber, por favor me avise.

alert('Hello');

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

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

alert('bye');

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

Se você deseja apenas impedir que outro código seja executado sem "gerar" nenhum erro, você pode substituir temporariamente, window.onerrorconforme mostrado em 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
fonte
0

Estou usando o iobroker e consegui facilmente parar o script com

stopScript();
user13449123
fonte
0

Não é aplicável na maioria das circunstâncias, mas eu tinha muitos scripts assíncronos em execução no navegador e como hack

window.reload();

para parar tudo.

M3RS
fonte
0

Eu sei que isso é antigo, mas se você quiser uma die()função PHP semelhante , poderá:

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

Uso:

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

O exemplo acima imprimirá apenas "Olá".

Nanoo
fonte
-1

Eu uso esse pedaço de código para interromper a execução:

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

você receberá um erro no console, mas ele funciona bem para mim.

john Smith
fonte
-2

Este é um exemplo de que, se existir uma condição, encerre o script. Eu uso isso no meu javascript do lado do cliente SSE, se o

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

não pode ser analisado diretamente da análise JSON ...

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

... de qualquer maneira, a idéia geral é:

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

isso irá finalizar / morrer seu script javasript

kapad
fonte
1
Isso realmente não responde à pergunta. Eles estão falando de um problema geral, nada a ver com suas variáveis ​​/ arquivo SSE específicos.
mjk
1
mjk - melhor agora?
kapad
-3

Eu uso a declaração de retorno em vez de throw como throw dá erro no console. a melhor maneira de fazer isso é verificar a condição

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

isso simplesmente interrompe a execução do programa a partir dessa linha, em vez de fornecer erros no console.

iamsaurav
fonte
1
No entanto, ele fornece o erro em seus linters como "Não é possível usar 'retornar' fora da função" #
Carles Alcolea
Para a execução porque a instrução é inválida. Você também pode usar if (condition) { new new }ou if (condition) { purpleMonkeyDishwasher(); }.
Coderer