مقدمه
الگوی async/await یک سینتکس مدرن برای نوشتن کدهای Promise است که در ES2017 ارائه شد.
این سینتکس باعث میشود کدهای async دقیقاً مثل کدهای sync به نظر برسند و خوانایی
و دیباگپذیری بسیار بهتری داشته باشند.
async/await نوشتن زنجیرهای چندین Promise، مدیریت خطا و اجرای ترتیبی عملیات را بسیار سادهتر و
شفافتر از then/catch یا callbackها میکند.
سینتکس توابع async و استفاده از await
اکر قبل از تعریف یک تابع از کلیدواژهی async استفاده کنیم، آن تابع همیشه یک Promise برمیگرداند.
در داخل تابع async میتوانیم از await
استفاده کنیم تا اجرای تابع تا زمان حل شدن Promise متوقف شود.
کد زیر یک Promise را با await دریافت میکند.
JAVASCRIPT
function fetchData() {
return new Promise(resolve => {
setTimeout(() => resolve("data is ready!"), 1000);
});
}
async function getData() {
let data = await fetchData();
console.log(data);
}
getData();
تابع getData با async تعریف شده و با await منتظر حل شدن Promise میماند. اجرای کدِ بعد از await
تا زمانی که داده آماده نشود، متوقف میماند. این ساختار باعث خوانایی و سادگی مدیریت عملیات غیرهمزمان
میشود.
مدیریت خطا در async/await
در توابع async میتوانید مدیریت خطا را با try/catch انجام دهید؛ درست مثل توابع عادی.
این مثال یک Promise شکستخورده را مدیریت میکند:
JAVASCRIPT
function fail() {
return new Promise((resolve, reject) => {
setTimeout(() => reject("error"), 1000);
});
}
async function run() {
try {
await fail();
} catch (e) {
console.log("error handled", e);
}
}
run();
در این مثال، اگر Promise شکست بخورد، catch خطا را گرفته و مدیریت میکند. این کار بسیار سادهتر و
قابل فهمتر از then/catch زنجیرهای است.
اجرای موازی با Promise و async/await
اگر چند عملیات async مستقل دارید و نمیخواهید منتظر یکدیگر باشند، میتوانید Promise.all و await
را ترکیب کنید.
این مثال دو Promise را به صورت موازی اجرا و نتیجه را دریافت میکند:
JAVASCRIPT
async function parallel() {
let [a, b] = await Promise.all([
fetchData(),
fetchData()
]);
console.log(a, b);
}
parallel();
در این مثال، هر دو Promise به صورت موازی اجرا میشوند و زمانی که هر دو آماده شدند، مقدار آنها
به صورت آرایه بازگردانده و لاگ میشود.
async/await خواناترین و مدرنترین ابزار مدیریت عملیات غیرهمزمان در جاوااسکریپت است. با استفاده
از آن میتوانید کدهای موازی، ترتیبی و قابل کنترل بسازید و خطاها را به روشی تمیز مدیریت کنید.
همیشه سعی کنید در پروژههای بزرگ به جای then/catch از async/await استفاده کنید تا هم کدها
خواناتر و هم مدیریت خطا آسانتر شود.