Rumah  >  Soal Jawab  >  teks badan

Gunakan async/wait dan forEach gelung untuk beroperasi

<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粉010967136P粉010967136427 hari yang lalu482

membalas semua(2)saya akan balas

  • P粉697408921

    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.

    balas
    0
  • P粉094351878

    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.

    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)
      }));
    }

    balas
    0
  • Batalbalas