Gunakan async/wait dan forEach gelung untuk beroperasi
P粉010967136
P粉010967136 2023-08-20 11:27:20
0
2
541
<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>
P粉010967136
P粉010967136

membalas semua(2)
P粉697408921

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粉094351878

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:

async function printFiles () {
  const files = await getFilePaths();

  for (const file of files) {
    const contents = await fs.readFile(file, 'utf8');
    console.log(contents);
  }
}

Bacaan selari

Jika anda ingin membaca fail secara selari, memang tidak boleh digunakan forEach。每个async回调函数调用都会返回一个promise,但你却将它们丢弃而不是等待它们。相反,你可以使用map,并使用Promise.alltunggu 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)
  }));
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan