۷

جاوااسکریپت غیرهمزمان ⏳⚡

چطوری چندتا کار رو با هم انجام بدیم بدون اینکه سایت هنگ کنه؟

همزمان در مقابل غیرهمزمان

در حالت همزمان (Synchronous)، کدها خط به خط اجرا میشن و تا یه کار تموم نشه، بعدی شروع نمیشه. اما در حالت غیرهمزمان (Asynchronous)، جاوااسکریپت یه کار زمان‌بر رو شروع می‌کنه و میره سراغ بقیه کدها، وقتی اون کار تموم شد، نتیجه‌ش رو بهمون خبر می‌ده.

قول‌ها (Promises) و `async/await`

`Promise` یه آبجکته که قول می‌ده یه کاری رو در آینده انجام بده (یا با موفقیت یا با شکست). `async/await` هم یه روش شیک و مدرنه که کار با Promiseها رو خیلی راحت‌تر و خواناتر می‌کنه.

مثال async/await
// این تابع یه قول می‌ده که بعد از ۲ ثانیه انجام بشه
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();