Rumah > Soal Jawab > teks badan
P粉6974089212023-08-21 10:27:16
Dengan ES2018 anda boleh memudahkan semua jawapan di atas:
async function printFiles () { const files = await getFilePaths() for await (const contents of files.map(file => fs.readFile(file, 'utf8'))) { console.log(contents) } }
Lihat spesifikasi: proposal-async-iteration
Diringkaskan:
for await (const results of array) { await longRunningTask() } console.log('I will wait')
2018-09-10: Jawapan ini telah mendapat perhatian ramai sejak kebelakangan ini, lihat siaran blog Axel Rauschmayer untuk mendapatkan maklumat lanjut tentang lelaran tak segerak.
P粉0943518782023-08-21 09:14:18
Sudah tentu, kod itu berfungsi, tetapi saya pasti ia tidak akan berfungsi seperti yang anda jangkakan. Ia hanya mencetuskan berbilang panggilan async, tetapi fungsi printFiles
kembali serta-merta selepas itu.
Jika anda ingin membaca fail secara berurutan, dan sememangnya tidak boleh menggunakan forEach
。相反,你可以使用现代的for … of
循环,其中await
akan berfungsi seperti yang diharapkan:
async function printFiles () { const files = await getFilePaths(); for (const file of files) { const contents = await fs.readFile(file, 'utf8'); console.log(contents); } }
Jika anda ingin membaca fail secara selari, memang tidak boleh digunakan forEach
。每个async
回调函数调用都会返回一个promise,但你却将它们丢弃而不是等待它们。相反,你可以使用map
,并使用Promise.all
tunggu susunan janji yang diperolehi:
async function printFiles () { const files = await getFilePaths(); await Promise.all(files.map(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) })); }