Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Asincrono?

Estas en el tema de Asincrono? en el foro de Frameworks JS en Foros del Web. Agradecería que alguien pudiese ayudarme con un pequeño problema que me ha surgido. Estoy programando un pequeño módulo para implementar en una web. Este módulo ...
  #1 (permalink)  
Antiguo 29/08/2008, 00:39
 
Fecha de Ingreso: septiembre-2007
Mensajes: 11
Antigüedad: 16 años, 8 meses
Puntos: 1
Asincrono?

Agradecería que alguien pudiese ayudarme con un pequeño problema que me ha surgido.
Estoy programando un pequeño módulo para implementar en una web. Este módulo es multilenguaje y el idioma se cambia por ajax llamando a un archivo php como el diguiente:
<? session_start(); ?>
<? $_SESSION['lang']='esp'; ?>
XGGLang =
{
TextAjuda : "Ayuda",
TextTornar : "Volver",
TextInstalar : "Instalar",
TextBorrar : "Borrar",...
}

El string devuelto por ajax (XGGLang={TxtAjuda....}) queda disponible para javascrip mediante una instrucción eval(). Luego, el módulo muestra los textos en el idioma elegido mediante las propiedades innerHTML, value...

El problema me sale en una página en la que, si no se reciben ciertos datos o, si estos no son correctos, se muestra un alert de error:

if ($error) {
echo "<script type='text/javascript'>alert(XGGLang.InstallTextError".$error .");</script>";
}

El problema viene de que, cuando se ejecuta este segundo código, aún no ha dado tiempo de que se hayan cargado los valores de XGGLang y, por tanto, el alert no muestra ningún mensaje.

Hay alguna forma de, desde otro script, detener la ejecución de la página hasta que se haya cargado completamente XGGLang? Se os ocurre otra solución?
  #2 (permalink)  
Antiguo 29/08/2008, 13:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Asincrono?

No hagas el request de forma asincrona, el 4to o 5to parametro de ajax.open es un booleano en el que le indicas si es o no asincrono, si no lo es, el script se para hasta obtener el resultado de send().

Saludos.
  #3 (permalink)  
Antiguo 31/08/2008, 08:31
 
Fecha de Ingreso: septiembre-2007
Mensajes: 11
Antigüedad: 16 años, 8 meses
Puntos: 1
Respuesta: Asincrono?

Gracias por tu respuesta. Es el tercer parámetro que con valor true ejecuta el proceso de forma asíncrona y con valor false lo ejecuta de forma sincrónica, pero ya hice pruebas con esto y no me funciona.

Por algún lugar he leido que la sincronía/asincronía solamente se refiere al script en que se ejecuta el open, lo cual significaría que el script del alert (creado en tiempo de ejecución por un echo de PHP) no se vería afectado por esta restricción. ¿Es esto correcto?
  #4 (permalink)  
Antiguo 31/08/2008, 21:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Asincrono?

Entonces no entendi tu proceso correctamente, quieres parar otro script en otra pagina, esperando el cargar el primero?

En ese caso creo no puedes hacerlo ni con AJAX ya que no hay visibilidad entre paginas.

Saludos.
  #5 (permalink)  
Antiguo 01/09/2008, 01:05
 
Fecha de Ingreso: septiembre-2007
Mensajes: 11
Antigüedad: 16 años, 8 meses
Puntos: 1
Respuesta: Asincrono?

Hola

No, los dos scripts están en la misma página, pero si hago un open('GET', url, false), el segundo script no se detiene, solamente se detiene el script que hace el open().

Lo ideal sería que el segundo script pudiese ser informado del httpStatus del open() y quedase pausado hasta que hubiese concluido satisfactoriamente la carga de datos, pero no veo cómo puede hacerse esto.

Otra posibilidad podría ser que la función que llama al open() devolviese un return true al acabar satisfactoriamente o un return false si fracasa la carga. Mientrastanto, los demás scripts incorporarían en su inicio un bucle while que esperaría ese resultado o que, pasados un número máximo de iteraciones, generase un error de carga. Pero tampoco acabo de encontrar la forma de que esto funcione.
  #6 (permalink)  
Antiguo 01/09/2008, 11:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Asincrono?

Mmm muy extraño si tu especificas que sea sincrono el llamar a ajax, todos los scripts deberían de parar hasta que ajax.open() regrese un resultado, revisa bien tu implementación es probable que ahí este el error.

Saludos.
  #7 (permalink)  
Antiguo 02/09/2008, 01:18
 
Fecha de Ingreso: septiembre-2007
Mensajes: 11
Antigüedad: 16 años, 8 meses
Puntos: 1
Una pregunta tonta que hasta ahora no me había planteado...

Supongamos que realmente sí se para la ejecución de los scripts y prosiguen el proceso cuando se ha finalizado la descarga de los datos por ajax. ¿Los scripts pausados se ejecutarán secuencialmente en orden de llamada o se ejecutarán en procesos paralelos?

El motivo de la pregunta es claro. Si se ejecutan procesos paralelos, evidentemente, el alert(mensaje) va a finalizar mucho antes de que el primer script haya terminado de ejecutar el eval(string), con lo que la variable para el mensaje aún no estará disponible.

Ya he encontrado el problema y no tiene nada que ver con ajax.

Simplemente llamo a la función de carga del pack de idioma en <body onload="">. Dado que el script llamado por onLoad se ejecuta cuando ya se ha cargado completamente la página, resulta que llamo al script del alert() antes de llamar al script cargador de idioma.

De todas formas sigue siendo interesante saber si los procesos javascript se ejecutan secuencialmente o en proceso paralelo.

Última edición por GatorV; 03/09/2008 a las 09:37
  #8 (permalink)  
Antiguo 02/09/2008, 08:07
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Asincrono?

Se ejecutan secuencialmente, en un estilo top down, todo depende desde donde los mandes llamar, al tu usar ajax, si "rompes" con un poco el estilo de ejecución pero sigue siendo top down. Lo mas recomendable es que siempre mandes iniciar los procesos al ejecutar el evento onload de la pagina para asegurar la disponibilidad de todos los elementos.

Saludos.
  #9 (permalink)  
Antiguo 03/09/2008, 00:14
 
Fecha de Ingreso: septiembre-2007
Mensajes: 11
Antigüedad: 16 años, 8 meses
Puntos: 1
Respuesta: Asincrono?

Gracias por la respuesta.

Respecto a lo de llamar a los scrips generales de la página desde onload, precisamente esa es mi costumbre, y precisamente ese ha sido mi error.

Ahora, el gestor de idiomas ya funciona perfectamente... en IE y en Opera... pero no funciona ni en Firefox ni en Netscape... creo que el script que pillé de InterNet para la conexión Ajax no es compatible con estos navegadores, aunque me suena raro que funcione en Opera y no en Firefox (Nestcape ha muerto y ya no me preocupa).
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:06.