Une lecture asynchrone et la mise en cache des fichiers multiples en nodejs
J'ai un tableau qui garde l'URL de plusieurs fichiers. Par exemple:
var files = ['1.html', '2.html', '3.html'];
J'ai besoin de les lire de manière asynchrone et de les enregistrer dans un objet nommé cache (cache = {}).
Pour ce faire j'ai utilisé le code:
for(var i = 0; i < files.length; i++){
require('fs').readFile(files[i], 'utf8', function (error,data) {
cache[files[i]]=data;
});
}
À la fin j'ai le résultat:
cache = { undefined : 'File 3 content' }
Je comprends que les "readFile" actes après la boucle est terminée et elle perd de son champ d'application. Est-il un moyen de résoudre ce problème ou une autre méthode pour lire les fichiers à partir d'un tableau et de les mettre en cache?
OriginalL'auteur micnic | 2012-03-08
Vous devez vous connecter pour publier un commentaire.
Lors de votre rappel à
readFile
s'exécute, la boucle sera déjà fini. Donci
serafiles.length
etfiles[i]
seraundefined
. Pour atténuer cela, vous avez besoin d'envelopper les variables d'une fermeture. La façon la plus simple de faire cela est de créer une fonction qui ne votrereadFile
appel, et l'appeler dans la boucle:Pour encore mieux le contrôle de l'exécution, vous voudrez peut-être regarder dans async:
Edit: Fait de l'utilisation de la fonction d'aide pour async exemple.
Je suis en utilisant asynchrone, mais j'ai besoin de passer 'utf8' comme argument de la fonction readFile, comment dois-je faire?
Vous avez besoin de créer une fonction d'aide qui passe "utf8". Quelque chose comme:
function read(file, callback) { fs.readFile(file, 'utf8', callback) }
. Modifier: Voir édité le post!OriginalL'auteur Linus Gustav Larsson Thiel
La réponse existant ne fonctionne pas pour moi. J'ai trouvé un package NPM qui a fait le travail: https://www.npmjs.com/package/read-multiple-files. Après
npm install read-multiple-files
à la ligne de commande, voici le code que j'ai utilisé:OriginalL'auteur KatieK