Lire un fichier en mode synchrone en Javascript
Je voudrais lire un fichier et de le convertir en une chaîne encodée en base64 à l'aide de l'objet FileReader. Voici le code que j'utilise :
var reader = new FileReader(); reader.onloadend = function(evt) { //le fichier est chargé result_base64 = evt.cible.résultat; }; reader.readAsDataURL(fichier);
Mais dans ce cas, j'obtiens le résultat de la conversion dans le gestionnaire d'événements (onLoadEnd de l'événement). Je voudrais une méthode synchrone. Est-il un moyen de la "readAsDataURL" méthode peut retourner directement la valeur de la 'result_base64 variable ?
Grâce
- "Je voudrais une méthode synchrone." Une raison particulière? Je ne pense pas que c'est possible.
- firefox a/avait le fichier.getAsDataURL() méthode, mais il est obsolète et a été le seul sync version de n'importe quel navigateur, autant que je sache.
- - Je stocker les chemins d'accès dans un local de stockage de base de données, j'ai besoin d'envoyer les images vers un serveur par la suite (avec une boucle sur toutes les images, c'est pourquoi j'ai besoin d'une méthode synchrone). Je voudrais éviter de stocker base64 chaînes de caractères dans la base de données afin de ne pas dépasser le local de stockage limite...
- Mais vous pourriez mettre en œuvre la boucle, par exemple en appelant le télécharger pour le prochain dans le rappel d'achèvement de l'image précédente
- Je voulais quelque chose de plus réutilisables que pourrait prendre un fichier comme entrée et le retour de la chaîne encodée en base64 de sortie mais il semble être impossible... Merci pour votre aide!
Vous devez vous connecter pour publier un commentaire.
Synchrone tâches (blocage) sont généralement mauvais. Si il n'y a pas vraiment de raison de le faire de manière asynchrone, je vous recommande fortement d'utiliser le rappel d'événement.
Imaginez que votre fichier est endommagé et les api HTML5 cant lire, il l'habitude de vous donner le résultat. Il serait briser votre code et de bloquer le site. Ou, quelqu'un pourrait sélectionner un fichier de 10 go, ce qui aurait pour effet de geler votre page HTML jusqu'à ce que le fichier soit complètement chargée. Avec asynchrone gestionnaire d'événement à votre mesure d'intercepter les erreurs possibles.
Pour contourner les limitations avec les rappels, j'utilise un truc tout simple:
la fonction de contrôle, vérifie chaque seconde si le prêt drapeau variable est définie sur true. Si oui, vous pouvez être sûr que le résultat est disponible.
Il peut ne pas être la meilleure pratique de le faire, mais j'ai fait une webapp à l'aide de cette technique environ 30 fois avec plus de 10 setTimeouts en même temps, en cours d'exécution, et n'a rencontré aucun problème jusqu'à maintenant.
Vous pouvez utiliser la norme FileReaderSync, ce qui est plus simple, synchrone, le blocage de la version de la FileReader API, similaire à ce que vous utilisez déjà:
Gardez à l'esprit que ce n'est disponible que dans les threads de travail, pour des raisons évidentes.
Si vous avez besoin d'une solution pour le thread principal qui "lit" comme un synchrone de l'API, vous pouvez enrouler le async FileReader en une promesse et l'utilisation asynchrone fonctions (vous devrez peut-être transpile):
De lire le contenu d'un fichier en mode synchrone utilisation fs.readFileSync
fs.createReadStream crée un ReadStream.
Dans Node.js, Utilisez
execSync
dechild_process
et ont la coquille de la lire pour vous de façon synchrone. Rediriger la sortie de ce processus enfant pour le parent.Je serai heureux d'accepter votre candidature pour le UUOC prix. 😉
Tard dans l'entreprise, mais peut-être cela va aider quelqu'un. Nous pouvons simplement prendre la lutte à l'extérieur de la chambre.