Gunakan async/wait dan forEach gelung untuk beroperasi
P粉010967136
2023-08-20 11:27:20
<p>Adakah terdapat sebarang masalah dengan menggunakan <kod>async</kod>/<kod>menunggu</kod> dalam gelung <kod>forEach</kod> Saya cuba mengulangi pelbagai fail dan menggunakan <kod>menunggu</code> </p>
<pre class="brush:php;toolbar:false;">import fs daripada 'fs-promise'
fungsi async printFiles () {
const files = await getFilePaths() // Anggap fungsi ini berfungsi dengan betul
files.forEach(async (fail) => {
kandungan const = tunggu fs.readFile(fail, 'utf8')
console.log(kandungan)
})
}
printFiles()</pre>
<p>Kod ini berfungsi, tetapi adakah terdapat sebarang masalah dengan berbuat demikian? Saya diberitahu bahawa saya tidak sepatutnya menggunakan <code>async</code>/<code>menunggu</code> dalam fungsi tertib tinggi seperti ini, jadi saya ingin bertanya sama ada terdapat sebarang soalan. </p>
Dengan ES2018 anda boleh memudahkan semua jawapan di atas:
Lihat spesifikasi: proposal-async-iteration
Diringkaskan:
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.
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.Baca mengikut urutan
Jika anda ingin membaca fail secara berurutan, dan sememangnya tidak boleh menggunakan
forEach
。相反,你可以使用现代的for … of
循环,其中await
akan berfungsi seperti yang diharapkan:Bacaan selari
Jika anda ingin membaca fail secara selari, memang tidak boleh digunakan
forEach
。每个async
回调函数调用都会返回一个promise,但你却将它们丢弃而不是等待它们。相反,你可以使用map
,并使用Promise.all
tunggu susunan janji yang diperolehi: