Mira este código :
<a href="#" id="link">Link</a>
<span>Moving</span>
$('#link').click(function () {
console.log("Enter");
$('#link').animate({ width: 200 }, 2000, function() {
console.log("finished");
});
console.log("Exit");
});
Como puede ver en la consola, la función "animar" es asíncrona y "bifurca" el flujo del código de bloqueo del controlador de eventos. De hecho :
$('#link').click(function () {
console.log("Enter");
asyncFunct();
console.log("Exit");
});
function asyncFunct() {
console.log("finished");
}
siga el flujo del código de bloque!
Si deseo crear mi function asyncFunct() { }
con este comportamiento, ¿cómo puedo hacerlo con javascript / jquery? Creo que hay una estrategia sin el uso de setTimeout()
javascript
jquery
function
asynchronous
markzzz
fuente
fuente
Respuestas:
No puede hacer una función asincrónica verdaderamente personalizada. Eventualmente tendrá que aprovechar una tecnología proporcionada de forma nativa, como:
setInterval
setTimeout
requestAnimationFrame
XMLHttpRequest
WebSocket
Worker
onload
De hecho, para la animación que utiliza jQuery
setInterval
.fuente
setInterval
) pero que ni siquiera podemos abrirla para ver cómo se hace. ¿Tienes más información sobre el tema?setImmediate
promises
. ¿Le da unawaitable
?Puedes usar un temporizador:
(dónde
yourFn
hay una referencia a su función)o con Lodash :
fuente
setTimeout
es de 4 milisegundos según la especificación HTML5. Darle 0 todavía tomará ese tiempo mínimo. Pero sí, funciona bien como diferidor de funciones.aquí tienes una solución simple (otros escriben sobre ello) http://www.benlesh.com/2012/05/calling-javascript-function.html
Y aquí tienes la solución lista para arriba:
PRUEBA 1 ( puede generar '1 x 2 3' o '1 2 x 3' o '1 2 3 x' ):
PRUEBA 2 ( siempre generará 'x 1' ):
Esta función se ejecuta con el tiempo de espera 0: simulará una tarea asincrónica
fuente
console.log(1)
se llama y la salida (undefined
) se pasa como el segundo argumento aasync()
. En el caso de TEST 1, creo que no entiendes completamente la cola de ejecución de JavaScript. Debido a que cada una de las llamadas se realizaráconsole.log()
en la misma pila,x
se garantiza que se registrará en último lugar. Votaría esta respuesta por información errónea, pero no tengo suficiente reputación.async(function() {console.log('x')}, function(){console.log(1)});
.TEST 2 as: async(function() {console.log('x')}, function(){console.log(1)});
- ya loAquí hay una función que toma otra función y genera una versión que se ejecuta de forma asíncrona.
Se utiliza como una forma simple de hacer una función asíncrona:
Esto es diferente de la respuesta de @ fider porque la función en sí misma tiene su propia estructura (no se agregó ninguna devolución de llamada, ya está en la función) y también porque crea una nueva función que se puede usar.
fuente
(function(a){ asyncFunction(a); })(a)
setTimeout(asyncFunction, 0, a);
Editar: entendí totalmente mal la pregunta. En el navegador, lo usaría
setTimeout
. Si fuera importante que se ejecutara en otro hilo, usaría Web Workers .fuente
Tarde, pero para mostrar una solución fácil de usar
promises
después de su introducción en ES6 , maneja las llamadas asincrónicas mucho más fácil:Establece el código asincrónico en una nueva promesa:
Nota para configurar
resolve()
cuando finalice la llamada asincrónica.Luego agrega el código que desea ejecutar después de que finalice la llamada asincrónica dentro
.then()
de la promesa:Aquí hay un fragmento de ello:
o JSFiddle
fuente
Esta página guía a través de los conceptos básicos para crear una función de JavaScript asíncrono.
Desde ES2017, las funciones asincrónicas de JavaScript son mucho más fáciles de escribir. También debería leer más sobre Promesas .
fuente
Si desea utilizar los parámetros y regular el número máximo de funciones asíncronas, puede utilizar un trabajador asíncrono simple que he creado:
Puedes usarlo así:
fuente
Aunque no es fundamentalmente diferente a las otras soluciones, creo que mi solución hace algunas cosas buenas adicionales:
Function.prototype
permitir una mejor manera de llamarloAdemás, la similitud con la función incorporada
Function.prototype.apply
me parece apropiada.fuente
Junto a la gran respuesta de @pimvdb, y en caso de que te lo preguntes, async.js tampoco ofrece funciones realmente asincrónicas. Aquí hay una versión (muy) simplificada del método principal de la biblioteca:
Por lo tanto, la función protege contra errores y la entrega con gracia a la devolución de llamada para que la maneje, pero el código es tan sincrónico como cualquier otra función JS.
fuente
Desafortunadamente, JavaScript no proporciona una funcionalidad asíncrona. Funciona solo en un solo hilo. Pero la mayoría de los navegadores modernos ofrecen
Worker
s , que son segundos scripts que se ejecutan en segundo plano y pueden devolver un resultado. Entonces, llegué a una solución que creo que es útil ejecutar asincrónicamente una función, que crea un trabajador para cada llamada asincrónica.El siguiente código contiene la función
async
para llamar en segundo plano.Este es un ejemplo de uso:
Esto ejecuta una función que itera un
for
con un número enorme para tomar tiempo como demostración de asincronía, y luego obtiene el doble del número pasado. Elasync
método proporciona unfunction
que llama a la función deseada en segundo plano, y en lo que se proporciona como parámetro deasync
devoluciones de llamadareturn
en su parámetro único. Entonces, en la función de devolución de llamada,alert
el resultado.fuente
MDN tiene un buen ejemplo sobre el uso de setTimeout preservando "esto".
Como el siguiente:
fuente