حلقه foreeach و async

استفاده از async/wait با حلقه forEach

سوال

آیا در استفاده از async/ await در یک حلقه forEach مشکلی وجود دارد؟ من سعی می کنم از میان آرایه ای از فایل ها و await محتویات هر فایل حلقه بزنم.

import fs from 'fs-promise'

async function printFiles () {
  const files = await getFilePaths() // Assume this works fine

  files.forEach(async (file) => {
    const contents = await fs.readFile(file, 'utf8')
    console.log(contents)
  })
}

printFiles()

این کد کار می کند، اما ممکن است مشکلی در این مورد پیش بیاید؟ من یک نفر را داشتم که به من گفت قرار نیست از async/ await در عملکرد بالاتری مانند این استفاده کنید، بنابراین فقط می خواستم بپرسم آیا مشکلی در این مورد وجود دارد یا خیر.

پاسخ

مطمئناً کد کار می کند، اما من تقریباً مطمئن هستم که آن چیزی که شما انتظار دارید را انجام نمی دهد. این فقط چند تماس نا همزمان را انجام می دهد، اما عملکرد printFiles بلافاصله پس از آن برمی گردد.

خواندن به ترتیب

اگر می خواهید فایل ها را به ترتیب بخوانید، نمی توانید از forEach استفاده کنید. فقط به جای آن از یک حلقه مدرن for … of استفاده کنید، که در آن await همانطور که انتظار می رود کار می کند:

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

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

خواندن به صورت موازی

اگر می خواهید فایل ها را به صورت موازی بخوانید، نمی توانید از forEach استفاده کنید. هر یک از async کال بک های تابع برگشت یک قول یا promise را برمی گرداند، اما شما به جای اینکه منتظر بمانید، آن ها را دور می اندازید. فقط از map به جای آن استفاده کنید و می توانید منتظر مجموعه ای از قول هایی باشید که با Promise.all دریافت خواهید کرد:

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

  await Promise.all(files.map(async (file) => {
    const contents = await fs.readFile(file, 'utf8')
    console.log(contents)
  }));
}

می توانید برای یادگیری زبان جاوا اسکریپت از مسیر کارآموزی جاوا اسکریپت استفاده کنید.

پاسخ‌ها

آدرس ایمیل شما منتشر نخواهد شد.

پل ورود به بازار تکنولوژی

مشاوره رایگان انتخاب مسیر

با کمک مشاورهای رستاوا آکادمی مسیر کارآموزی مناسب برای خودت رو برای ورود به بازار کار تکنولوژی انتخاب کن

توسعه فردی برای حرفه‌ای شدن

منتورهای رستاوا و دوره‌های ما شما رو برای کارآموزی و در نهایت جذب و استخدام آماده میکنن

مدرک بین المللی و استانداردهای جهانی

یادگیری با استاندار های بین المللی و دریافت مدرک از Credx Academy کانادا

اگر در مسیرهای کارآموزی ما پذیرش بگیری موقعیت‌های کارآموزی و استخدام در پروژه‌ها و شرکت های بین المللی از طریق مجموعه رستاوا به روت باز می شه.

۲ هفته رایگان

همین حالا با منتورها

ارتباط آنی بگیر!