En Javascript, hay funciones sincrónicas y asincrónicas .
Funciones sincrónicas
La mayoría de las funciones en Javascript son sincrónicas. Si tuviera que llamar a varias funciones síncronas seguidas
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
ellos ejecutarán en orden. doSomethingElse
no comenzará hasta que se doSomething
haya completado. doSomethingUsefulThisTime
, a su vez, no comenzará hasta que se doSomethingElse
haya completado.
Funciones asincrónicas
Sin embargo, la función asincrónica no se esperará la una a la otra. Veamos el mismo ejemplo de código que teníamos arriba, esta vez suponiendo que las funciones son asíncronas.
doSomething();
doSomethingElse();
doSomethingUsefulThisTime();
Las funciones se inicializarán en orden, pero todas se ejecutarán aproximadamente al mismo tiempo. No puede predecir constantemente cuál terminará primero: el que tarde menos tiempo en ejecutarse terminará primero.
Pero a veces, desea que las funciones que sean asíncronas se ejecuten en orden, y a veces desea que las funciones que sean sincrónicas se ejecuten de forma asíncrona. Afortunadamente, esto es posible con devoluciones de llamada y tiempos de espera, respectivamente.
Devoluciones de llamada
Supongamos que tenemos tres funciones asíncronas que queremos ejecutar en orden, some_3secs_function
, some_5secs_function
, y some_8secs_function
.
Dado que las funciones se pueden pasar como argumentos en Javascript, puede pasar una función como devolución de llamada para que se ejecute después de que la función se haya completado.
Si creamos las funciones como esta
function some_3secs_function(value, callback){
//do stuff
callback();
}
entonces puedes llamar en orden, así:
some_3secs_function(some_value, function() {
some_5secs_function(other_value, function() {
some_8secs_function(third_value, function() {
//All three functions have completed, in order.
});
});
});
Tiempos de espera
En Javascript, puede indicarle a una función que se ejecute después de un cierto tiempo de espera (en milisegundos). De hecho, esto puede hacer que las funciones síncronas se comporten de forma asíncrona.
Si tenemos tres funciones sincrónicas, podemos ejecutarlas de forma asincrónica utilizando la setTimeout
función.
setTimeout(doSomething, 10);
setTimeout(doSomethingElse, 10);
setTimeout(doSomethingUsefulThisTime, 10);
Sin embargo, esto es un poco feo y viola el principio DRY [wikipedia] . Podríamos limpiar esto un poco creando una función que acepte un conjunto de funciones y un tiempo de espera.
function executeAsynchronously(functions, timeout) {
for(var i = 0; i < functions.length; i++) {
setTimeout(functions[i], timeout);
}
}
Esto se puede llamar así:
executeAsynchronously(
[doSomething, doSomethingElse, doSomethingUsefulThisTime], 10);
En resumen, si tiene funciones asincrónicas que desea ejecutar sincrónicamente, use devoluciones de llamada, y si tiene funciones sincrónicas que desea ejecutar de forma asincrónica, use tiempos de espera.