Comprender la lectura de archivos asincrónicos de fs
Necesitamos leer todos los archivos en una carpeta determinada. Dado que hay carpetas anidadas, necesitamos usar la recursividad para lograr este objetivo.
En primer lugar, utilizar el método de sincronización es muy sencillo de implementar:
La lógica de la sincronización es muy simple. Cada paso espera a que se ejecute el paso anterior antes de ejecutarse. eso. No hay gran problema.
Entonces, ¿cómo utilizar la implementación asincrónica?
Lo primero que pensé fue usar async/await para controlar la ejecución de lecturas asincrónicas de fs.readdir().
duang ~ error ~
El motivo del error es que ningún método en el módulo nodejs fs devuelve una promesa y, por supuesto, async/await no se puede utilizar para manejarlo.
El código fuente del módulo fs de nodejs es el siguiente:
La principal diferencia entre los métodos readdir() y readdirSync() del módulo fs es que readdirSync() El método devuelve directamente el enlace.readdir() El resultado leído por el método. El método readdir () no devuelve ningún valor, solo devuelve la devolución de llamada del método onComplete como el objeto FSReqCallback, lo que indica dónde se obtiene el contenido leído devuelto cuando el método de devolución de llamada se ejecuta nuevamente después de que la lectura sea exitosa.
Se puede ver que el método fs.readdir() no devuelve una promesa, y el uso directo de await para modificar el método fs.readdir() no puede sincronizar la operación del método, por lo que se realiza una lectura asincrónica. E/S No tiene sentido obtener información del archivo.
Entonces, ¿cómo utilizar correctamente la lectura asincrónica?
Al prometer el valor de retorno del método fs.readdir(), puedes usar async/await.
De hecho, el uso de async/await bloqueará operaciones posteriores y deberá esperar hasta que se complete readDir antes de poder realizar otras operaciones, por lo que esto no es esencialmente diferente de la sincronización y requiere más esfuerzo, por lo que Se promociona readDir y usar async/await solo no tiene sentido.
Pero aquí eso no es un problema.
Pero aquí, al leer el archivo de mapa, tiene sentido fs.stat() de forma asincrónica y usar async/await. De esta manera, no es necesario esperar hasta que se complete la operación antes de continuar con el siguiente recorrido, lo cual es bueno para la eficiencia.