Lire un fichier de manière synchrone en Javascript

Je voudrais lire un fichier et le convertir en une chaîne codée en base64 en utilisant L'objet FileReader. Voici le code que j'utilise:


    var reader = new FileReader();
    reader.onloadend = function(evt) {  
        // file is loaded
        result_base64 = evt.target.result; 
    };
    reader.readAsDataURL(file); 


Mais dans ce cas, j'obtiens le résultat de la conversion dans le gestionnaire d'événements (événement onLoadEnd). Je voudrais une méthode synchrone. Existe-t-il un moyen pour la méthode "readAsDataURL" de renvoyer directement la valeur de la variable 'result_base64'?

Merci

24
demandé sur Laila 2013-06-12 18:51:54

3 réponses

Les tâches synchrones (blocage) sont généralement mauvaises. S'il n'y a aucune raison réelle de le faire de manière asynchrone, je vous recommande fortement d'utiliser le rappel d'événement.

Imaginez que votre fichier est cassé et que l'api HTML5 ne peut pas lire, cela ne vous donnera pas le résultat. Cela casserait votre code et bloquerait le site. Ou, quelqu'un pourrait sélectionner un fichier de 10 Go, ce qui gèlerait votre page HTML jusqu'à ce que le fichier soit complètement chargé. Avec ce gestionnaire d'événements asynchrone, vous pouvez attraper les erreurs possibles.

À contourner les limitations avec les rappels, j'utilise un truc 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 fonction check vérifie toutes les secondes si la variable ready flag est définie sur true. Si oui, vous pouvez être sûr que le résultat est disponible.

Ce n'est peut-être pas la meilleure pratique de le faire, mais j'ai fait une webapp en utilisant cette technique environ 30 fois avec plus de 10 setTimeouts en même temps, et n'ai rencontré aucun problème jusqu'à présent.

14
répondu David Fariña 2016-02-11 18:31:38

Dans Le Noeud.js, utilisez execSync de child_process et demandez au shell de le lire pour vous de manière synchrone. Redirigez la sortie de ce processus enfant vers le parent.

// 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();

J'accepterai volontiers votre nomination pour le prix UUOC. ;)

-1
répondu Stephen Wylie 2017-04-24 22:16:26

En retard dans l'entreprise, mais peut-être cela aidera quelqu'un. Nous pouvons tout simplement prendre le combat en dehors de la pièce.

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];
    }
}
-4
répondu AtanuCSE 2016-02-11 18:33:02