Me gustaría usar async / await con algunas operaciones del sistema de archivos. Normalmente async / await funciona bien porque lo uso babel-plugin-syntax-async-functions
.
Pero con este código me encuentro con el caso if donde names
no está definido:
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();
Cuando reconstruyo el código en la versión de devolución de llamada todo está bien y obtengo los nombres de archivo. Gracias por tus sugerencias.
javascript
node.js
async-await
fs
Quellenangeber
fuente
fuente
SyntaxError: Unexpected token import
mensaje de error. ¿node8 admiteimport
token por defecto?import
sintaxis. Actualmente requiere algo de transpiling. Estaría bien usar tambiénconst fs = require('fs')
oconst { promisify } = require('util')
{err, names} = function
llama la sintaxis?names = await readdir('path/to/dir');
y si hay unerr
controlador en elcatch
bloque. De cualquier manera, el nombre de la sintaxis es una tarea de desestructuración que fue solo en respuesta a la pregunta de Qasim.El soporte nativo para asíncrono espera funciones fs desde el Nodo 11
Desde Node.JS 11.0.0 (estable) y la versión 10.0.0 (experimental), tiene acceso a los métodos del sistema de archivos que ya están prometidos y puede usarlos con
try catch
manejo de excepciones en lugar de verificar si el valor devuelto de la devolución de llamada contiene un error.¡La API es muy limpia y elegante! Simplemente use
.promises
miembro delfs
objeto:fuente
return await
prometes, el bloqueo no sirve de nada ... Creo que a veces es una buena práctica esperar antes de regresarNode.js 8.0.0
Asíncrono nativo / espera
Promisificar
Desde esta versión, puede usar la función nativa Node.js de la biblioteca util .
Envoltura de promesas
Consejo
Utilice siempre
try..catch
para bloques de espera, si no desea volver a lanzar la excepción superior.fuente
await
debe estar siempre enasync
bloque :)const res = await readFile('data.json') console.log(res)
en alguna función asíncronafs.promises
y usarloasync/await
es muy confuso para míthen
,catch
etc. Donde están asíncronos / aguardan es el flujo de comportamiento moderno.Puede producir un comportamiento incorrecto porque File-Api
fs.readdir
no devuelve una promesa. Solo toma una devolución de llamada. Si desea utilizar la sintaxis de espera asíncrona, puede 'prometer' la función de esta manera:y llámalo en su lugar:
fuente
A partir de v10.0 , puede usar
fs.Promises
Ejemplo usando
readdir
Ejemplo usando
readFile
fuente
ExperimentalWarning: The fs.promises API is experimental
advertencia: github.com/pnpm/pnpm/issues/1178v10.15.3
- es posible suprimir el mensaje. Sin embargo, con el problema aún abierto, pensé que valía la pena mencionarlo.readFile
,? Soy nuevo en todo esto promete, y todo lo que quiero hacer es tener una funcióngetContent
que pueda llamar y esperar en varias partes a lo largo de mi guión, sin embargo, esto está resultando muy confusoEsta es la versión de TypeScript a la pregunta. Es utilizable después del Nodo 11.0:
fuente
Esto es lo que funcionó para mí:
Este código funciona en el nodo 7.6 sin babel cuando la bandera de la armonía está activada:
node --harmony my-script.js
. Y comenzando con el nodo 7.7, ¡ni siquiera necesita esta bandera !La
fsp
biblioteca incluida al principio es solo un contenedor prometido parafs
(yfs-ext
).¡Estoy realmente entusiasmado con lo que puedes hacer en el nodo sin babel en estos días! ¡Native
async
/await
hacer que escribir código sea un placer!ACTUALIZACIÓN 2017-06: el módulo fs-promise fue obsoleto. Utilice en su
fs-extra
lugar con la misma API.fuente
Se recomienda utilizar un paquete npm como https://github.com/davetemplin/async-file , en comparación con las funciones personalizadas. Por ejemplo:
Otras respuestas están desactualizadas
fuente
Tengo este pequeño módulo de ayuda que exporta versiones de funciones prometidas
fs
fuente
Nodo v14.0.0 y superior
solo puedes hacer:
tal como importarías de
"fs"
vea este PR para más detalles: https://github.com/nodejs/node/pull/31553
fuente