Je ne peux pas comprendre comment async
/ await
fonctionne. Je le comprends un peu mais je ne peux pas le faire fonctionner.
function loadMonoCounter() {
fs.readFileSync("monolitic.txt", "binary", async function(err, data) {
return await new Buffer( data);
});
}
module.exports.read = function() {
console.log(loadMonoCounter());
};
Je sais que je pourrais utiliser readFileSync
, mais si je le fais, je sais que je ne comprendrai jamais async
/ await
et je vais simplement enterrer le problème.
Objectif: appeler loadMonoCounter()
et renvoyer le contenu d'un fichier.
Ce fichier est incrémenté à chaque incrementMonoCounter()
appel (à chaque chargement de page). Le fichier contient le vidage d'un tampon en binaire et est stocké sur un SSD.
Peu importe ce que je fais, j'obtiens une erreur ou undefined
dans la console.
node.js
asynchronous
readfile
Jérémy Dicaire
la source
la source
Réponses:
Pour utiliser
await
/async
vous avez besoin de méthodes qui renvoient des promesses. Les fonctions principales de l'API ne font pas cela sans des wrappers commepromisify
:À noter,
readFileSync
ne prend pas de rappel, il renvoie les données ou lève une exception. Vous n'obtenez pas la valeur souhaitée car la fonction que vous fournissez est ignorée et vous ne capturez pas la valeur de retour réelle.la source
async
/await
, c'est donc une étape nécessaire. La bonne nouvelle estpromisify
que cela fonctionne généralement sans gâchis.const file = await readFile...; return file;
.Depuis Node v11.0.0, les promesses fs sont disponibles nativement sans
promisify
:la source
import { promises as fs } from "fs";
si vous souhaitez utiliser la syntaxe d'importation.C'est la version TypeScript de la réponse de @ Joel. Il est utilisable après le Node 11.0:
la source
Vous pouvez facilement encapsuler la commande readFile avec une promesse comme ceci:
puis utilisez:
la source
Vous pouvez utiliser
fs.promises
disponible nativement depuis Node v11.0.0la source
const fs = require('fs').promises
Il existe une
fs.readFileSync( path, options )
méthode synchrone.la source