Não há método de sono em JS. Se você deseja hibernar, deve definir um método.
função sono (númeroMillis) {var agora = new Date (); var exittime = agora.getTime () + numberMillis; while (true) {agora = new Date (); if (agora.getTime ()> exittime) retornar; }}A seguir, são as adições:
Além do JS narrativo, o JWACS (JavaScript com suporte avançado de continuação) também está comprometido em evitar escrever funções de retorno de chamada que são problemáticas chamadas assíncronas, estendendo a sintaxe do JavaScript. O sono implementado com o JWACS, o código é o seguinte:
A cópia do código é a seguinte:
função sono (msec) {
var k = function_continuation;
setTimeout (function () {retomar k <- mesc;}, msec);
suspender;
}
Essa sintaxe é ainda mais assustadora e é um nome de método de encadeamento que não é recomendado em Java. Francamente, tendem a JS narrativo.
Como o JS narrativo, os JWACs também precisam ser pré -compilados, e o pré -compilador está escrito em linguagem Lisp. É também a versão alfa no momento. Para mais apresentações e comparações dos dois, consulte o novo artigo no SitePoint: eliminando retornos de chamada de javascript assíncronos por pré -processamento
Ao escrever scripts JavaScript complexos, às vezes é necessário esperar que o script possa parar por um período de tempo especificado, semelhante ao efeito alcançado pelo thread.Sleep em Java ou pelo comando do sono no script sh.
Como todos sabemos, o JavaScript não fornece funções de controle de threads semelhantes ao Java. Embora existam dois métodos, Settimeout e SetInterval, que podem executar algum controle de execução cronometrado, eles não podem atender a todos os requisitos. Sempre houve muitas pessoas perguntando como implementar o sono/pausa/esperar em JavaScript, e existem de fato algumas soluções muito esfarrapadas:
A maneira mais fácil e pior é escrever um loop, o código pode ser o seguinte:
A cópia do código é a seguinte:
função sono (númeroMillis) {
var agora = new Date ();
var exittime = agora.getTime () + numberMillis;
while (true) {
agora = new Date ();
if (agora.gettime ()> exittime)
retornar;
}
}
O código acima realmente não dorme o intérprete do script e também tem o efeito de aumentar rapidamente a CPU para alta carga. O navegador estará até em um estado de morte falso por esse período de tempo.
Em segundo lugar, as pessoas inteligentes usam a implementação da caixa de diálogo especial do IE para se conectar. O código pode ser o seguinte:
A cópia do código é a seguinte:
função sono (tempo limite) {
window.showmodaldialog ("javascript: document.writeln ('<cript> window.setTimeout (function () {window.close ();}," + timeout + "); <// script>');");
} window.alert ("Antes do sono ...");
Sleep (2000);
window.alert ("Depois do sono ...");
Escusado será dizer que apenas os suportes do IE (o IE7 não podem atingir seu objetivo devido a restrições de segurança).
Além disso, também existem truques como o uso do applet ou ligar para o Windows Script do host wscript.sleep (), que são todos os últimos resorts.
Finalmente, há pessoas mais inteligentes que desenvolveram talvez a melhor solução. Vejamos o código primeiro:
A cópia do código é a seguinte:
função sono (milis) {
var notificer = njsruntime.createnotifier ();
setTimeout (notificador, millis);
notifier.wait-> ();
}
É isso mesmo, ver a sintaxe de -> () é surpreendente ao ver a função $ () do protótipo. No entanto, esse script relatará erros de sintaxe diretamente no navegador. De fato, eles precisam ser pré -compilados no JavaScript aprovado pelo navegador do cliente. O script compilado é o seguinte:
A cópia do código é a seguinte:
função sono (milis) {
var njf1 = njen (isto, argumentos, "millis");
NJ: while (1) {
tente {switch (njf1.cp) {
Caso 0: njf1._notifier = njsruntime.createnotifier ();
setTimeout (njf1._notifier, njf1._millis);
njf1.cp = 1;
njf1._notifier.wait (njf1);
retornar;
Caso 1: Break NJ;
}} catch (ex) {
if (! njf1.except (ex, 1))
retornar;
}}
njf1.pf ();
}
Não consigo entender, e não quero mais entender. Todas essas tarefas serão implementadas pela narrativa JavaScript - uma extensão JS que fornece funcionalidade de bloqueio assíncrono para nós. Precisamos apenas escrever a sintaxe estranha -> () antes e, em seguida, implementar o efeito do sono por meio de compilação pré -estática ou compilação dinâmica do primeiro plano.
O JavaScript narrativo afirma libertá -lo das funções de retorno de chamada tonto e escrever tarefas claras de longa duração. Atualmente, ainda é a versão do Alpha e há um exemplo de um botão em movimento na página de exemplo. O download do código -fonte também está disponível na página inicial. Com meu fraco conhecimento básico, mal posso ver que a implementação da máquina de estado é simulada no código. Espero que amigos proficientes em algoritmos possam analisar para nós.
Por fim, sempre tive meu ponto de vista: mantenha o JavaScript simples, a menos que seja necessário. Antes que o JavaScript possa fornecer suporte a rosqueamento nativo, talvez possamos alterar o design para evitar aplicativos de bloqueio assíncronos.
Uma implementação tortuosa de insetos
<Tipo de script "Texto/javascript">/*Implementação da função de pausa no JavaScript JavaScript em si não possui função de pausa (o sono não pode ser usado) ao mesmo tempo, o VBScript não pode usar doevents; portanto, escreva essa função para implementar esta função. O JavaScript é uma linguagem de objeto fraca e uma função também pode ser usada como objeto. Por exemplo: [código] function test () {alert ("hellow"); this.NextStep = function () {alert ("nextStep"); }} Podemos chamar var myTest = new test (); myTest.NextStep (); Quando fazemos uma pausa, uma função pode ser dividida em duas partes, a inalterada antes da operação de pausa, e colocar o código a ser executado após a pausa neste.nextStep. Para controlar a pausa e a continuação, precisamos escrever duas funções para implementar funções de pausa e continuação, respectivamente. A função de pausa é a seguinte: */Função pausa (obj, iMinsecond) {if (window.eventlist == null) window.eventList = new Array (); var Ind = -1; for (var i = 0; i <window.eventlist.length; i ++) {if (window.eventlist [i] = null) {window.eventlist [i] = obj; ind = i; quebrar; }} if (ind ==-1) {ind = window.eventlist.length; window.EventList [ind] = obj; } setTimeout ("goon (" + ind + ")", 1000);}/*Esta função coloca a função a ser pausada na janela da matriz.eventlist e, ao mesmo tempo, chama a função contínua através do setTimeout. A função contínua é a seguinte: */function goon (ind) {var obj = window.eventlist [ind]; Window.EventList [ind] = null; if (obj.nextstep) obj.nextStep (); else obj ();}/*Esta função chama o método NextStep da função suspensa. Se esse método não estiver disponível, a função será chamada novamente. Depois que a função é escrita, podemos escrever o seguinte volume: */function test () {alert ("hellow"); Pausa (this, 1000); // chamando a função de pausa this.nextStep = function () {alert ("nextStep"); }} </script>