elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [javascript] Leyendo un archivo de texto.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [javascript] Leyendo un archivo de texto.  (Leído 1,973 veces)
MA40

Desconectado Desconectado

Mensajes: 252


--- I ❤ Ƀ ---


Ver Perfil WWW
[javascript] Leyendo un archivo de texto.
« en: 24 Marzo 2018, 00:12 am »

Hola.

Tengo el siguiente problema.

Primero declaro la variable global “Array_con_el_archivo” como un Array.

Luego abro el archivo de texto “Archivo.txt”, y asigno su contenido, línea a línea, al Array que he creado anteriormente.

Pues bien, si pongo una alerta para que me muestre el contenido del Array en la posición (1) SÍ se muestra. Pero si la pongo en la posición (2) NO se muestra (el Array está vacío).

Código
  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <script type="text/javascript">
  5.  var Array_con_el_archivo = new Array();
  6.  if(window.XMLHttpRequest) {
  7.    var Archivo = new XMLHttpRequest();
  8.  }
  9.  else if(window.ActiveXObject) {
  10.    var Archivo = new ActiveXObject("Microsoft.XMLHTTP");
  11.  }
  12.  Archivo.open("GET", "archivo.txt", true);
  13.  Archivo.onreadystatechange = function() {
  14.    if ((Archivo.readyState === 4) && (Archivo.status === 200)){
  15.      Array_con_el_archivo = Archivo.responseText.split("\n");
  16.      alert(Array_con_el_archivo);  // Con esta alerta (1) SI se muestra el contenido del archivo.
  17.    }
  18.  }
  19.  Archivo.send(null);
  20.  alert(Array_con_el_archivo);  // Con esta alerta (2) NO se muestra el contenido del archivo.
  21. </script>
  22. </head>
  23. <body>
  24. </body>
  25. </html>

Pregunta: ¿Se puede hacer de alguna forma que la alerta en la posición (2) muestre el contenido del archivo?

Un saludo.


En línea

¿Qué sucedería si se enfrentara una fuerza imparable contra un muro inamovible?
Visita Ediciones MA40 - Libros clásicos de ajedrez y este blog de ajedrez
ChessFaucet.com - Gana bitcoins jugando al ajedrez contra el ordenador
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: [javascript] Leyendo un archivo de texto.
« Respuesta #1 en: 24 Marzo 2018, 00:55 am »

Lo hace porque el segundo alert se ejecuta ANTES que el primero. Es bastante sencillo de comprobar: Pones un Date al lado del texto y lo veras.

Código
  1. alert((new Date) + Array_con_el_archivo);

Recuerda, prácticamente todo en javascript se hace de manera asíncrona, eso quiere decir que una función puede ejecutarse antes que otra hasta que salte un evento. En tu caso, ese evento es onreadystatechange que salta DESPUÉS de cargar el archivo.

Te sugiero que revises algún tutorial sobre funciones asíncronas y callbacks en javascript.

En tu caso, la solución seria hacer que el evento llame a un callback donde puedas procesar el archivo.


Código
  1. function obtenerArchivo(archivo, callback){
  2.    if(window.XMLHttpRequest){
  3.        var handler = new XMLHttpRequest();
  4.        handler.open('GET', archivo, true);
  5.  
  6.        handler.onreadystatechange = function(){
  7.            if(handler.readyState === handler.DONE && handler.status === 200){
  8.                callback(handler.responseText);
  9.            }
  10.        };
  11.  
  12.        handler.send();
  13.  
  14.        return true;
  15.    }
  16.  
  17.    return false;
  18. }


Y para procesarlo podrías usar:

Código
  1. function procesarArchivo(contenido){
  2.    Array_con_el_archivo = contenido.split("\n");
  3.    alert(Array_con_el_archivo);
  4.  
  5.    return true;
  6. }
  7.  
  8. obtenerArchivo('archivo.txt', procesarArchivo);

o bien..

Código
  1. obtenerArchivo('archivo.txt', function(contenido){
  2.    Array_con_el_archivo = contenido.split("\n");
  3.    alert(Array_con_el_archivo);
  4. });


Saludos


En línea

MA40

Desconectado Desconectado

Mensajes: 252


--- I ❤ Ƀ ---


Ver Perfil WWW
Re: [javascript] Leyendo un archivo de texto.
« Respuesta #2 en: 25 Marzo 2018, 13:48 pm »

Hola.

Muchas gracias #!drvy.

Veo que el problema es más complejo de lo que puede parecer en un principio.

Te comento un poco por si puedes ayudarme a rematar el proyecto. El proyecto está hecho en Leguaje Python, lo he hecho yo. Se trata de un Faucet de ajedrez (una web que te da un premio en Bitcoins si ganas una partida de ajedrez a un programa con un nivel no demasiado alto).

Bien, aunque la web está hecha en Python, he utilizado un javascript de dominio público un tanto complicado, se trata del motor de análisis de las jugadas.

Mis conocimientos de javascript son un poco limitados, lo justo para modificar el javascript que he utilizado y poco más.

Una de las modificaciones que he hecho es añadir un libro de aperturas (los primeros movimientos de las partidas) al motor de análisis. Este libro de aperturas no es otra cosa que un archivo de texto que se tiene que leer desde el motor (javascript), de ahí el problema.

Concretamente, el problema consiste en que cuando el usuario juega con blancas SÍ se carga el libro de aperturas, pero cuando juega con negras NO.

Seguramente, la solución correcta requiere reescribir una gran parte del javascript, algo que quisiera evitarme. PERO, en las pruebas que he estado haciendo para intentar solucionarlo, he conseguido una casi-solución (chapucera). La casi-solución consiste en añadir una línea con la instrucción “alert();” en un determinado sitio. Haciendo simplemente eso, se soluciona todo: El problema es que no se necesita que en ese momento salte ninguna alerta.

Entonces la pregunta es la siguiente: ¿Se podría sustituir esa instrucción “alert();” por otra que no haga nada [lo único que tiene que hacer es lo que “alert();” hacía para solucionar el problema (desconozco lo que es)]?

Te pongo la dirección del proyecto por si quieres echarle un vistazo: http://www.chessfaucet.com

La modificación con la instrucción “alert("Empezar");” sólo está incluida en la versión en español y cuando el usuario juega con negras.

Si quieres probar a jugar SIN la modificación puedes probar a jugar en la versión en inglés o en español con blancas. Y si quieres probar a jugar CON la modificación, entonces en español con negras.

Un saludo y gracias.
« Última modificación: 25 Marzo 2018, 14:06 pm por MA40 » En línea

¿Qué sucedería si se enfrentara una fuerza imparable contra un muro inamovible?
Visita Ediciones MA40 - Libros clásicos de ajedrez y este blog de ajedrez
ChessFaucet.com - Gana bitcoins jugando al ajedrez contra el ordenador
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
error en runtime leyendo datos de un archivo binario c++
Programación C/C++
winroot 2 2,715 Último mensaje 16 Mayo 2010, 01:29 am
por winroot
Buscar texto dentro de archivo de texto por GUI
GNU/Linux
spysecurityca 1 2,234 Último mensaje 30 Diciembre 2014, 03:01 am
por MinusFour
Error Leyendo un archivo con varios objetos
Java
bash 0 1,532 Último mensaje 11 Febrero 2016, 16:42 pm
por bash
Ayuda leyendo archivo de 5 GB [OutOfMemoryError]
Java
LaThortilla (Effort) 5 2,395 Último mensaje 17 Noviembre 2016, 04:32 am
por Konlex
Bucle leyendo archivo que tenga cambio python
Scripting
dian1919 8 4,688 Último mensaje 13 Septiembre 2022, 05:40 am
por dian1919
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines