Simple nodejs rappel exemple avec fs.readFile
Je suis en train d'apprendre la programmation asynchrone et a été aux prises avec la leçon 4 de nodeschool.io avec la mise en œuvre d'un async io avec des rappels.
En gros, je suis en train d'utiliser fs.readFile pour compter le nombre de retours à la ligne dans un fichier en utilisant une fonction de rappel.
Voici mon code:
var fs = require('fs');
var pathToFile = process.argv[2];
function counter(callback) {
var buffer = fs.readFile(pathToFile, function (err, data) {
var bufferString = buffer.toString();
var bufferStringSplit = bufferString.split('\n');
});
callback();
}
function logMyNumber() {
console.log(bufferStringSplit.length-1);
}
counter(logMyNumber);
Je comprends que les rappels sont exécutées une fois la ligne de code est terminée en cours d'exécution, afin de ne pas le
var bufferString = buffer.toString();
var bufferStringSplit = bufferString.split('\n');
être appelée après la fs.readFile() a fini de lire le fichier à partir du disque?
Puis enfin le callback() appelle logMyNumber, qui devrait juste sortie le nombre de lignes du fichier.
- Votre rappel déclare une variable
data
mais à l'intérieur de votre rappel de la référence debuffer
. Ensuite, vous faites référence àbufferStringSplit
dans une autre fonction qui n'est pas déclarée. Aussi, votrecallback
danscounter
est appelé à l'extérieur de la fonction de rappel dereadFile
donc elle va être exécutée avant l'readFile
finitions. Suivez la chaîne de rappels.
Vous devez vous connecter pour publier un commentaire.
Vous avez plusieurs questions et je vais essayer de décrire tous du mieux que possible
Problème 1: portée des Variables
Solution:
Déclarer les variables dans le module du champ d'application:
Problème 2: Rappels
Problème 3: fs.readFile API
fs.readFile
ne retourne rien, de sorte que votrebuffer
variable au-dessous estnull
Solution:
Enfin, le code devrait ressembler à:
bufferString
etbufferStringSplit
hors de la portée globale, vous pouvez tous les faire passer sur le rappel decounter
:callback( bufferString, bufferStringSplit)
.Même problème pour moi. C'est ma solution.
Essayer de traiter les erreurs ainsi. Pas sûr, si c'est mieux pour propager l'erreur dans le dernier rappel. Je pense que la fonctionnalité est assez basique, mais de toute façon je suis la propagation des erreurs.
Je voudrais aussi dire, c'est plus correct de délégué la split dans le dernier rappel plutôt que de passer par l'intermédiaire d'un argument ou similaire.