No hay método de sueño en JS. Si quieres hibernar, debes definir un método tú mismo.
function sleep (numberMillis) {var ahora = new Date (); var exitTime = now.gettime () + numberMillis; while (true) {ahora = new Date (); if (ahora.gettime ()> exitTime) return; }}Las siguientes son las adiciones:
Además de JS narrativo, JWACS (JavaScript con soporte de continuación avanzado) también se compromete a evitar escribir funciones de devolución de llamada que sean problemáticas de forma asincrónica extendiendo la sintaxis de JavaScript. El sueño implementado con JWACS, el código es el siguiente:
La copia del código es la siguiente:
function sleep (msec) {
var k = function_continuation;
setTimeOut (function () {reanudar k <- mesc;}, msec);
suspender;
}
Esta sintaxis es aún más aterradora, y es un nombre de método de hilo que no se recomienda en Java. Francamente, tiendo a la narrativa JS.
Al igual que Narrative JS, JWACS también debe ser precompilado, y el precompilador está escrito en lenguaje Lisp. También es la versión alfa en este momento. Para obtener más presentaciones y comparaciones de los dos, consulte el nuevo artículo sobre Sitepoint: eliminar las devoluciones de llamada de Async JavaScript mediante el preprocesamiento
Al escribir scripts de JavaScript complejos, a veces es necesario esperar que el script pueda detenerse por un período de tiempo específico, similar al efecto logrado por el hilo.
Como todos sabemos, JavaScript no proporciona funciones de control de hilos similares a Java. Aunque hay dos métodos, SetTimeout y SetInterval, que pueden realizar algún control de ejecución cronometrado, no pueden cumplir con todos los requisitos. Siempre ha habido muchas personas preguntando cómo implementar el sueño/pausa/esperar en JavaScript, y de hecho hay algunas soluciones muy tontas:
La forma más fácil y peor es escribir un bucle, el código puede ser el siguiente:
La copia del código es la siguiente:
function sleep (numbermillis) {
var ahora = nueva fecha ();
var exitTime = now.gettime () + numberMillis;
while (verdadero) {
ahora = nueva fecha ();
if (ahora.gettime ()> exitTime)
devolver;
}
}
El código anterior en realidad no duerme el intérprete de script, y también tiene el efecto de aumentar rápidamente la CPU a una alta carga. El navegador incluso estará en un estado de muerte falso durante ese período de tiempo.
En segundo lugar, las personas inteligentes usan la implementación del cuadro de diálogo especial de IE para conectarse entre sí. El código puede ser el siguiente:
La copia del código es la siguiente:
function sleep (timeout) {
Window.ShowModalDialog ("javascript: document.writeLn ('<script> window.setTimeout (function () {window.close ();}," + timeOut + "); <// script>');");
} window.alert ("antes de dormir ...");
Sleep (2000);
Window.alert ("Después del sueño ...");
No hace falta decir que solo es de IE (IE7 no puede lograr su objetivo debido a restricciones de seguridad).
Además, también hay trucos como el uso de Applet o Llamar a Windows Script Host's Wscript.sleep (), que son todos los últimos recursos.
Finalmente, hay personas más inteligentes que han desarrollado quizás la mejor solución. Veamos primero el código:
La copia del código es la siguiente:
function sleep (milis) {
var notificador = njsruntime.createNotifier ();
setTimeOut (notificador, milis);
Notifier.Wait-> ();
}
Así es, ver la sintaxis de -> () es sorprendente como ver la función $ () del prototipo. Sin embargo, este script informará errores de sintaxis directamente en el navegador. De hecho, deben ser precompilados en JavaScript aprobado por el navegador del cliente. El script compilado es el siguiente:
La copia del código es la siguiente:
function sleep (milis) {
var njf1 = njen (esto, argumentos, "milis");
NJ: while (1) {
Pruebe {Switch (NJF1.CP) {
Caso 0: njf1._notifier = njsruntime.createnotifier ();
setTimeout (njf1._notifier, njf1._millis);
njf1.cp = 1;
njf1._notifier.wait (njf1);
devolver;
Caso 1: Romper NJ;
}} catch (ex) {
if (! njf1.except (ex, 1))
devolver;
}}
njf1.pf ();
}
No puedo entenderlo, y ya no quiero entenderlo. Todas estas tareas serán implementadas por Narrative JavaScript, una extensión JS que nos proporciona funcionalidad de bloqueo asíncrono. Solo necesitamos escribir la sintaxis Weird -> () antes, y luego implementar el efecto del sueño a través de la compilación preestática o la compilación dinámica del primer plano.
Narrative JavaScript afirma liberarlo de las mareadas funciones de devolución de llamada y escribir tareas claras de ejecución larga. Actualmente, sigue siendo la versión de Alpha, y hay un ejemplo de un botón móvil en la página de ejemplo. La descarga del código fuente también está disponible en la página de inicio. Con mi débil conocimiento básico, apenas puedo ver que la implementación de la máquina de estado se simula en el código. Espero que los amigos que son competentes en algoritmos puedan analizarlo por nosotros.
Finalmente, siempre he tenido mi punto de vista: por favor mantenga a JavaScript simple a menos que sea necesario. Antes de que JavaScript pueda proporcionar soporte de roscado nativo, tal vez podamos cambiar el diseño para evitar aplicaciones de bloqueo asíncrono.
Una tortuua implementación de errores
<tipo de script "Text/JavaScript">/*Implementación de la función de pausa en JavaScript JavaScript en sí no tiene la función de pausa (el sueño no se puede usar) al mismo tiempo, VBScript no puede usar doevents, por lo que escribir esta función para implementar esta función. JavaScript es un lenguaje de objetos débil, y una función también se puede usar como objeto. Por ejemplo: [código] function test () {alert ("hellow"); this.nextstep = function () {alert ("nextstep"); }} Podemos llamar var mytest = new test (); mytest.nextstep (); Cuando hacemos una pausa, una función se puede dividir en dos partes, el no cambiado antes de la operación de pausa, y colocar el código para ejecutarse después de la pausa en este. Para controlar la pausa y la continuación, necesitamos escribir dos funciones para implementar funciones de pausa y continuación, respectivamente. La función de pausa es la siguiente: */function pause (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; romper; }} if (ind ==-1) {ind = window.eventList.length; Window.EventList [ind] = obj; } setTimeout ("Goon (" + ind + ")", 1000);}/*Esta función pone la función para que se detenga en la ventra de matriz.EventList, y al mismo tiempo llama a la función continua a través de SetTimeOut. La función continua es la siguiente: */function Goon (ind) {var obj = window.eventList [ind]; Window.eventList [ind] = null; if (obj.nextstep) obj.nextstep (); else obj ();}/*Esta función llama al método NextStep de la función suspendida. Si este método no está disponible, se volverá a llamar a la función. Después de que se escribe la función, podemos escribir el siguiente volumen: */function test () {alert ("hellow"); Pausa (this, 1000); // llamando a la función de pausa this.nextstep = function () {alert ("nextstep"); }} </script>