Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: MA40 en 24 Marzo 2018, 00:12 am



Título: [javascript] Leyendo un archivo de texto.
Publicado por: MA40 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.


Título: Re: [javascript] Leyendo un archivo de texto.
Publicado por: #!drvy 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


Título: Re: [javascript] Leyendo un archivo de texto.
Publicado por: MA40 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 (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.