que - manipular elementos html javascript
Leer un archivo de forma sincronizada en Javascript. (4)
Me gustaría leer un archivo y convertirlo en una cadena codificada en base64 usando el objeto FileReader. Aquí está el código que utilizo:
var reader = new FileReader(); reader.onloadend = function(evt) { // file is loaded result_base64 = evt.target.result; }; reader.readAsDataURL(file);
Pero en este caso, obtengo el resultado de la conversión en el controlador de eventos (evento onLoadEnd). Me gustaría un método sincrónico. ¿Hay alguna manera de que el método "readAsDataURL" pueda devolver directamente el valor de la variable ''result_base64''?
Gracias
En Node.js, use execSync
de child_process
y child_process
que el shell lo lea de forma síncrona. Redirigir la salida de este proceso hijo al padre.
// Don''t forget to use your favorite encoding in toString()
var execSync = require(''child_process'').execSync;
var fileContents = execSync(''cat path/to/file.txt'', {stdio: "pipe"}).toString();
Con mucho gusto aceptaré su nominación para el premio UUOC. ;)
Las tareas síncronas (bloqueo) son generalmente malas. Si no hay una razón real para hacerlo asincrónicamente, le recomiendo que use la devolución de llamada del evento.
Imagina que tu archivo está roto y que el api de HTML5 no se puede leer, no te dará el resultado. Rompería tu código y bloquearía el sitio. O, alguien podría seleccionar un archivo de 10GB, que congelaría su página HTML hasta que el archivo esté completamente cargado. Con ese manejador asíncrono de eventos puedes capturar posibles errores.
Para evitar las limitaciones con devoluciones de llamada, utilizo un truco simple:
var ready = false;
var result = '''';
var check = function() {
if (ready === true) {
// do what you want with the result variable
return;
}
setTimeout(check, 1000);
}
check();
var reader = new FileReader();
reader.onloadend = function(evt) {
// file is loaded
result = evt.target.result;
ready = true;
};
reader.readAsDataURL(file);
la función de verificación, comprueba cada segundo si la variable de indicador de listo se establece en verdadero. Si es así, puede estar seguro de que el resultado está disponible.
Puede que no sea una buena práctica hacerlo, pero hice una aplicación web usando esta técnica unas 30 veces con más de 10 setTimeouts al mismo tiempo en ejecución, y no experimenté ningún problema hasta ahora.
Para leer el contenido de un archivo, utilice fs.readFileSync
var fs = require(''fs'');
var content = fs.readFileSync(''myfilename'');
console.log(content);
fs.createReadStream crea un ReadStream .
Tarde en el negocio, pero puede ser que esto ayude a alguien. Simplemente podemos tomar la lucha fuera de la sala.
var file = $(''#myfile'')[0].files[0];
var reader = new FileReader();
reader.onload = function(progressEvent) {
//console.log(this.result);
handle(this.result);
};
reader.readAsText(file);
function handle(temp_lines) {
var inputLines=new Array();
var lines = temp_lines.split(''/n'');
for(var line = 0; line < lines.length; line++) {
console.log(lines[line]);
inputLines[line]=lines[line];
}
}