Foros del Web » Programando para Internet » Javascript »

Javascript sincronizacion/wait

Estas en el tema de Javascript sincronizacion/wait en el foro de Javascript en Foros del Web. Buenos días! El problema que planteo puede ser algo confuso aunque lo voy a explicar lo mejor que pueda: He desarrollado una función que implementa ...
  #1 (permalink)  
Antiguo 17/02/2012, 20:26
Avatar de Escain  
Fecha de Ingreso: enero-2007
Mensajes: 21
Antigüedad: 17 años, 3 meses
Puntos: 3
Javascript sincronizacion/wait

Buenos días!

El problema que planteo puede ser algo confuso aunque lo voy a explicar lo mejor que pueda:

He desarrollado una función que implementa la típica línea "#include" en Javascript:
algo así como:
Código:
Include("otroArchivo.js");
El problema es que dicha función es sincrona y cuando hay muchos archivos, la carga se hace lenta.
He hecho pues la modificación del Include para que sea asíncrona.
Problema: imaginemos lo siguiente:
Código:
Include("archivoFuncionA.js");

var i = A();
Obviamente la segunda línea falla puesto que A no ha terminado la carga asíncrona y por lo tanto no existe aún.
Mi idea para solucionar esto es una fórmula que se usa mucho en OpenGL: Encerrar las instrucciones en un bloque:
Código:
Include.BeginAsync();
Include("archivoFuncionA.js"); Include("archivoFuncionB.js");
Include.EndAsync();
La función BeginAsync es trivial, pero la EndAsync es otra cosa.
De momento la he implementado con espera activa, es decir, comprobando cada 0.1s si todos los archivos que empezaron a cargarse ya finalizaron/cancelaron.

Las esperas activas no me gustan, la question que me preocupa ahora es pues si existe alguna forma (sea o no muy correcta para Javascript) para hacer en la función "EndAsync" una espera y que sea el evento de fin de carga el que reanude EndAsync.
En un lenguaje imaginario, sería algo asi:
Código:
Funcion EndAsync(){
Wait(10);
} Funcion onLoadedCallback(){
EndAsync.continue();
}
Es decir, la función evento al terminar de incluir el código cancela la espera de la función EndAsync, reanudando así la ejecución normal del código.

Muchas gracias de antemano por las aportaciones.
  #2 (permalink)  
Antiguo 17/02/2012, 20:41
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Javascript sincronizacion/wait

Te recomendaría leer sobre promises/deferred, bastante interesante el tema.
__________________
blog | @aijoona
  #3 (permalink)  
Antiguo 18/02/2012, 09:40
Avatar de alejandromg  
Fecha de Ingreso: noviembre-2011
Ubicación: Tegucigalpa, HN
Mensajes: 35
Antigüedad: 12 años, 5 meses
Puntos: 15
Respuesta: Javascript sincronizacion/wait

Como dice @Aijoona promises/deferred es el tema acá. Si buscas inspiración:

https://github.com/waka/js-promise-simple
https://gist.github.com/1859023

O el mismo jQuery.Deferred. Si usas node.js el modulo async realiza cosas similares.
__________________
¿Te gusto mi comentario? +1 ;)

Alejandro Morales. La mejor forma de contactarme :: via twitter @_alejandromg
CTO at numbus
  #4 (permalink)  
Antiguo 18/02/2012, 12:45
Avatar de Escain  
Fecha de Ingreso: enero-2007
Mensajes: 21
Antigüedad: 17 años, 3 meses
Puntos: 3
Respuesta: Javascript sincronizacion/wait

Buenas tardes!
Primero gracias a ambos por vuestra aportación.

He estado investigando acerca de Deffered/promises y es muy interesante, pero hasta donde he entendido, pretenden ser una interfaz estándar de propagación de eventos, pero no implementan ningún tipo de sincronización.
Si uso Deffered en mi código: imagino que sería la función evento la que llamaría "resolve" y el objeto deffered pasaría el evento a la función onDone(), y me encontraría en el mismo problema de sincronizacion entre la función endAsync y el evento onDone.
El módulo async también hace uso de Callback, hasta donde conozco no implementa sincronización de funciones.
  #5 (permalink)  
Antiguo 19/02/2012, 07:19
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Javascript sincronizacion/wait

Me cuesta seguirte, pero vamos a hacer un esfuerzo. No conozco nadie que haga lo que mencionas de manera síncronica en el browser.

Conoces YUI? YUI hace includes de archivos de manera dinamica para su inclusión en sandboxes requeridos, paso a ejemplificar.

Código Javascript:
Ver original
  1. YUI().use("node", "datatype-number", "cache-base" ,function (Y) {
  2.     var cache = new Y.Cache();
  3.     //...
  4. });

Como bien notarás, este proceso es asíncrono.

curl.js, otra excelente librería de AMD (Asynchronous Module Definition) es bastante similar:

Código Javascript:
Ver original
  1. curl(['dep1', 'dep2', 'dep3' /* etc */])
  2.     .then(callback, errorback);

Esta misma metodología la vas a encontrar en otros frameworks/librerías (ExtJS, LAB.js, $script, etc).

Si usas promesas, cada carga de archivo es una promesa, y su carga finalizada seria su resolve, luego, cuando todas las promesas requeridas estén cumplidas (es decir, cargaste tus dependencias), asincronicamente se ejecutara la consecuencia.
__________________
blog | @aijoona
  #6 (permalink)  
Antiguo 19/02/2012, 11:46
Avatar de Escain  
Fecha de Ingreso: enero-2007
Mensajes: 21
Antigüedad: 17 años, 3 meses
Puntos: 3
Respuesta: Javascript sincronizacion/wait

He seguido buscando y tal como decís en vuestros post, no parece haber forma de sincronizar en javascript, este lenguaje parece agarrarse en su paradigma de eventos mas que la pintura seca. Me quedaré pues en la forma actual del Include síncrono.
Gracias por vuestras aportaciones.

PD: Avisadme cuando implementen semaforos
  #7 (permalink)  
Antiguo 19/02/2012, 21:21
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 12 años, 11 meses
Puntos: 343
Respuesta: Javascript sincronizacion/wait

No se puede implementar ningun tipo de semaforo en el browser ya que la ejecución de JS y de la interfaz gráfica corren sobre un único thread.

Simplemente es otro paradigma.
__________________
blog | @aijoona

Etiquetas: function, sincronization, wait
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:00.