Maison > Questions et réponses > le corps du texte
P粉6974089212023-08-21 10:27:16
Avec ES2018, vous pouvez grandement simplifier toutes les réponses ci-dessus :
async function printFiles () { const files = await getFilePaths() for await (const contents of files.map(file => fs.readFile(file, 'utf8'))) { console.log(contents) } }
Voir la spécification : proposition-async-iteration
Simplifié :
for await (const results of array) { await longRunningTask() } console.log('I will wait')
2018-09-10 : Cette réponse a retenu beaucoup d'attention ces derniers temps, voir Le billet de blog d'Axel Rauschmayer pour plus d'informations sur l'itération asynchrone.
P粉0943518782023-08-21 09:14:18
Bien sûr, le code fonctionne, mais je suis presque sûr qu'il ne fonctionnera pas comme prévu. Cela déclenche simplement plusieurs appels asynchrones, mais la fonction printFiles
revient immédiatement après.
Si vous souhaitez lire le fichier de manière séquentielle et qu'en effet ne pouvez pas l'utiliser, forEach
。相反,你可以使用现代的for … of
循环,其中await
fonctionnera comme prévu :
async function printFiles () { const files = await getFilePaths(); for (const file of files) { const contents = await fs.readFile(file, 'utf8'); console.log(contents); } }
Si vous souhaitez lire le fichier en parallèle, il n'est en effet pas possible d'utiliser forEach
。每个async
回调函数调用都会返回一个promise,但你却将它们丢弃而不是等待它们。相反,你可以使用map
,并使用Promise.all
wait sur le tableau de promesse obtenu :
async function printFiles () { const files = await getFilePaths(); await Promise.all(files.map(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) })); }