جاوااسکریپت غیرهمزمان ⏳⚡
چطوری چندتا کار رو با هم انجام بدیم بدون اینکه سایت هنگ کنه؟
همزمان در مقابل غیرهمزمان
در حالت همزمان (Synchronous)، کدها خط به خط اجرا میشن و تا یه کار تموم نشه، بعدی شروع نمیشه. اما در حالت غیرهمزمان (Asynchronous)، جاوااسکریپت یه کار زمانبر رو شروع میکنه و میره سراغ بقیه کدها، وقتی اون کار تموم شد، نتیجهش رو بهمون خبر میده.
قولها (Promises) و `async/await`
`Promise` یه آبجکته که قول میده یه کاری رو در آینده انجام بده (یا با موفقیت یا با شکست). `async/await` هم یه روش شیک و مدرنه که کار با Promiseها رو خیلی راحتتر و خواناتر میکنه.
// این تابع یه قول میده که بعد از ۲ ثانیه انجام بشه
const fetchData = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("اطلاعات با موفقیت دریافت شد! 🎉");
}, 2000);
});
// با async/await منتظر جواب قول میمونیم
async function getData() {
try {
console.log("در حال دریافت اطلاعات...");
const response = await fetchData; // منتظر میمونیم
console.log("موفقیت:", response);
} catch (error) {
console.log("شکست:", error);
}
}
getData();
تمرین! 🧠
یه تابع `async` به اسم `getWeather` بنویس. داخلش یه Promise بساز که بعد از ۱.۵ ثانیه، به صورت رندوم یا `resolve` بشه (با پیام "هوای امروز آفتابیه ☀️") یا `reject` بشه (با پیام "سیستم هواشناسی قطعه! 🌩️").
جواب تمرین
function checkWeatherPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const isSunny = Math.random() > 0.5; // 50% شانس
if (isSunny) {
resolve("هوای امروز آفتابیه ☀️");
} else {
reject("سیستم هواشناسی قطعه! 🌩️");
}
}, 1500);
});
}
async function getWeather() {
try {
console.log("در حال بررسی وضعیت آب و هوا...");
const weatherReport = await checkWeatherPromise();
console.log(weatherReport);
} catch (error) {
console.error(error);
}
}
getWeather();