Je voudrais utiliser async / await avec certaines opérations du système de fichiers. Normalement, async / await fonctionne bien parce que j'utilise babel-plugin-syntax-async-functions
.
Mais avec ce code, je rencontre le cas if où names
n'est pas défini:
import fs from 'fs';
async function myF() {
let names;
try {
names = await fs.readdir('path/to/dir');
} catch (e) {
console.log('e', e);
}
if (names === undefined) {
console.log('undefined');
} else {
console.log('First Name', names[0]);
}
}
myF();
Lorsque je reconstruis le code dans la version de l'enfer de rappel, tout va bien et j'obtiens les noms de fichiers. Merci pour vos conseils.
javascript
node.js
async-await
fs
Quellenangeber
la source
la source
SyntaxError: Unexpected token import
message d'erreur s'affiche. node8 prend-il en charge leimport
jeton par défaut?import
syntaxe. Il nécessite actuellement un certain transpilage. Serait bien d'utiliser égalementconst fs = require('fs')
ouconst { promisify } = require('util')
{err, names} = function
s'appelle la syntaxe?names = await readdir('path/to/dir');
et s'il y a uneerr
poignée dans lecatch
bloc. Quoi qu'il en soit, le nom de la syntaxe est une affectation de déstructuration qui était juste en réponse à la question de Qasim.Prise en charge native des fonctions async await fs depuis Node 11
Depuis Node.JS 11.0.0 (stable) et la version 10.0.0 (expérimentale), vous avez accès aux méthodes du système de fichiers qui sont déjà promis et vous pouvez les utiliser avec la
try catch
gestion des exceptions plutôt que de vérifier si la valeur renvoyée par le rappel contient une erreur.L'API est très propre et élégante! Utilisez simplement le
.promises
membre de l'fs
objet:la source
return await
votre promesse, le bloc catch ne sert à rien ... Je pense que c'est parfois une bonne pratique d'attendre avant de revenirNode.js 8.0.0
Asynchrone natif / attente
Promisify
À partir de cette version, vous pouvez utiliser la fonction native Node.js de la bibliothèque util .
Emballage de la promesse
Conseil
Utilisez toujours
try..catch
pour les blocs d'attente, si vous ne voulez pas renvoyer l'exception en haut.la source
await
doit toujours être dans leasync
bloc :)const res = await readFile('data.json') console.log(res)
dans une fonction asynchronefs.promises
et l'utiliser avecasync/await
est si déroutant pour moithen
,catch
etc. Où sont async / await est le flux de comportement moderne.Vous risquez de produire un comportement incorrect car File-Api
fs.readdir
ne renvoie pas de promesse. Cela ne prend qu'un rappel. Si vous voulez utiliser la syntaxe async-await, vous pouvez `` promettre '' la fonction comme suit:et appelez-le à la place:
la source
À partir de la v10.0 , vous pouvez utiliser
fs.Promises
Exemple d'utilisation
readdir
Exemple d'utilisation
readFile
la source
ExperimentalWarning: The fs.promises API is experimental
avertissement: github.com/pnpm/pnpm/issues/1178v10.15.3
- il est possible de supprimer le message. Cependant, avec le problème toujours ouvert, j'ai pensé qu'il valait la peine d'être mentionné.readFile
,? Je suis nouveau dans tout ce truc de promesses, et tout ce que je veux faire, c'est avoir une fonctiongetContent
que je peux appeler et attendre dans diverses parties de mon script, mais cela s'avère très déroutantCeci est la version TypeScript à la question. Il est utilisable après le Node 11.0:
la source
Voici ce qui a fonctionné pour moi:
Ce code fonctionne dans le nœud 7.6 sans babel lorsque le drapeau de l' harmonie est activée:
node --harmony my-script.js
. Et à partir du nœud 7.7, vous n'avez même pas besoin de ce drapeau !La
fsp
bibliothèque incluse au début n'est qu'un wrapper promis pourfs
(etfs-ext
).Je suis vraiment ravi de ce que vous pouvez faire dans node sans babel ces jours-ci! Natif
async
/await
faire de l'écriture du code un tel plaisir!MISE À JOUR 2017-06: le module fs-promise est obsolète. Utilisez à la
fs-extra
place avec la même API.la source
Il est recommandé d'utiliser un package npm tel que https://github.com/davetemplin/async-file , par rapport aux fonctions personnalisées. Par exemple:
D'autres réponses sont obsolètes
la source
J'ai ce petit module d'aide qui exporte des versions promises des
fs
fonctionsla source
Node v14.0.0 et supérieur
vous pouvez simplement faire:
tout comme vous importeriez de
"fs"
voir ce PR pour plus de détails: https://github.com/nodejs/node/pull/31553
la source