این کد رو زیاد میبینیم:
users.forEach(async (user) => {
await sendEmail(user);
});ظاهرش کاملاً منطقیه.
ولی یک مشکل مهم داره:
تابع forEach منتظر
Promiseهای داخل Callback نمیمونه.یعنی ممکنه همه sendEmail
ها تقریباً همزمان شروع بشن و کدی که بعد از forEach نوشته شده، قبل از تمام شدن اونها اجرا بشه.اگر واقعاً میخوای یکییکی اجرا بشن:
for (const user of users) {
await sendEmail(user);
}و اگر مستقل از هم هستن و میخوای همزمان اجرا بشن:
await Promise.all(
users.map(user => sendEmail(user))
);
تفاوت این دو فقط Syntax نیست.
اولی:
کنترلشده و ترتیبی
دومی:
همزمان و سریعتر، ولی با مصرف منابع بیشتر
پس وقتی Async Code مینویسی، همیشه از خودت بپرس:
این عملیات باید یکییکی انجام بشه یا واقعاً میتونن همزمان اجرا بشن؟
همین یک سؤال میتونه جلوی کلی Bug و Performance Problem رو بگیره.
@CodeVerse_dev