213 votes

Comment lire un fichier avec async / wait correctement?

Je ne peux pas comprendre comment async/await œuvres. J'ai un peu le comprend 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 enterrer la question.

Objectif: Appeler loadMonoCounter() et retourne le contenu d'un fichier.

Ce fichier est incrémenté à chaque fois incrementMonoCounter() est appelée (à chaque chargement de la page). Le fichier contient le dump d'un tampon dans le fichier binaire est stocké sur un disque SSD.

Pas de mather ce que je fais, j'obtiens une erreur ou pas défini dans la console.

358voto

Joel Points 4723

Depuis Node v11.0.0, les promesses sont disponibles en mode natif sans promisify :

 const fs = require('fs').promises;
async function loadMonoCounter() {
    const data = await fs.readFile("monolitic.txt", "binary");
    return new Buffer(data);
}
 

224voto

tadman Points 70178

Pour utiliser await/async vous avez besoin de méthodes qui retournent des promesses. L'API de base, les fonctions ne font pas le faire sans wrappers comme promisify:

const fs = require('fs');
const util = require('util');

// Convert fs.readFile into Promise version of same    
const readFile = util.promisify(fs.readFile);

async function getStuff() {
  return await readFile('test');
}

// Can't use `await` outside of an async function so you need to chain
// with then()
getStuff().then(data => {
  console.log(data);
})

Comme une note, readFileSync ne prend pas de rappel, il renvoie les données ou lève une exception. Vous n'obtenez pas la valeur que vous souhaitez parce que la fonction que vous fournissez est ignoré et vous n'êtes pas la capture de la valeur de retour.

47voto

HKTonyLee Points 710

Ceci est la version dactylographiée de la réponse de @ Joel. Il est utilisable après le noeud 11.0:

 import { promises as fs } from 'fs';

async function loadMonoCounter() {
    const data = await fs.readFile('monolitic.txt', 'binary');
    return Buffer.from(file);
}

main();
 

32voto

Shlomi Schwartz Points 2218

Vous pouvez facilement envelopper la commande readFile avec une promesse comme ceci:

 async function readFile(path) {
    return new Promise((resolve, reject) => {
      fs.readFile(path, 'utf8', function (err, data) {
        if (err) {
          reject(err);
        }
        resolve(data);
      });
    });
  }
 

puis utilisez:

 await readFile("path/to/file");
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X