Comme la réponse de @ Bergi, mais avec une différence.
Promise.all
rejette toutes les promesses si l'on est rejeté.
Donc, utilisez une récursivité.
const readFilesQueue = async (files, index = 0) {
const contents = await fs.readFile(files[index], 'utf8')
console.log(contents)
return files.length <= index
? readFilesQueue(files, ++index)
: files
}
const printFiles async = () => {
const files = await getFilePaths();
const printContents = await readFilesQueue(files)
return printContents
}
printFiles()
PS
readFilesQueue
est en dehors de la printFiles
cause de l'effet secondaire * introduit parconsole.log
, il est préférable de se moquer, de tester et / ou d'espionner, donc ce n'est pas cool d'avoir une fonction qui renvoie le contenu (sidenote).
Par conséquent, le code peut simplement être conçu par cela: trois fonctions séparées qui sont "pures" ** et n'introduisent aucun effet secondaire, traitent la liste entière et peuvent facilement être modifiées pour gérer les cas ayant échoué.
const files = await getFilesPath()
const printFile = async (file) => {
const content = await fs.readFile(file, 'utf8')
console.log(content)
}
const readFiles = async = (files, index = 0) => {
await printFile(files[index])
return files.lengh <= index
? readFiles(files, ++index)
: files
}
readFiles(files)
Édition future / état actuel
Le nœud prend en charge l'attente de niveau supérieur (cela n'a pas encore de plugin, ne l'aura pas et peut être activé via les indicateurs d'harmonie), c'est cool mais ne résout pas un problème (stratégiquement, je ne travaille que sur les versions LTS). Comment obtenir les fichiers?
Utilisation de la composition. Étant donné le code, cela me donne l'impression que c'est à l'intérieur d'un module, donc, devrait avoir une fonction pour le faire. Sinon, vous devez utiliser un IIFE pour envelopper le code de rôle dans une fonction asynchrone créant un module simple qui fait tout pour vous, ou vous pouvez choisir la bonne façon, il y a, la composition.
// more complex version with IIFE to a single module
(async (files) => readFiles(await files())(getFilesPath)
Notez que le nom de la variable change en raison de la sémantique. Vous passez un foncteur (une fonction qui peut être invoquée par une autre fonction) et recevez un pointeur sur la mémoire qui contient le bloc logique initial de l'application.
Mais, si ce n'est pas un module et que vous devez exporter la logique?
Enveloppez les fonctions dans une fonction asynchrone.
export const readFilesQueue = async () => {
// ... to code goes here
}
Ou changez les noms des variables, peu importe ...
*
par effet secondaire menans tout effet colacteral de l'application qui peut changer le statut / comportement ou introuce des bogues dans l'application, comme IO.
**
par "pure", c'est dans l'apostrophe car les fonctions ne sont pas pures et le code peut être convergé vers une version pure, quand il n'y a pas de sortie console, seulement des manipulations de données.
De plus, pour être pur, vous devrez travailler avec des monades qui gèrent les effets secondaires, qui sont sujettes aux erreurs et traitent cette erreur séparément de l'application.
for ... of ...
fonctionne?