بەڵێنەکان (Promises) چییە؟

لە جافاسکریپتدا، زۆربەی کارەکان بە شێوەی ئاسینکرۆن (Asynchronous) ئەنجام دەدرێن، وەک داواکردنی داتا لە سێرڤەرێکەوە. بەڵێن یان Promise ئۆبجێکتێکە کە نوێنەرایەتی ئەنجامی کارێکی ئاسینکرۆن دەکات کە ڕەنگە لە داهاتوودا تەواو ببێت یان شکست بهێنێت.

تێبینی: بەڵێنەکان وەک بەڵێنێکی ڕاستەقینە وان؛ کاتێک شتێک بەڵێن دەدەیت، یان بەڵێنەکەت دەبەیتە سەر (Resolved) یان ناتوانیت بەڵێنەکەت ببەیتە سەر (Rejected).

دۆخەکانی Promise

هەر بەڵێنێک لە یەکێک لەم سێ دۆخەدا دەبێت:

  • Pending (چاوەڕوان): دۆخی سەرەتایی، هێشتا کارەکە تەواو نەبووە.
  • Fulfilled (سەرکەوتوو): کارەکە بە سەرکەوتوویی تەواو بووە.
  • Rejected (شکستخواردوو): کارەکە بەهۆی هەڵەیەکەوە شکستی هێناوە.

دروستکردنی یەکەم Promise

بۆ دروستکردنی بەڵێنێک، پێویستە ئۆبجێکتێک لە جۆری new Promise دروست بکەین کە دوو ئەرگومێنتی resolve و reject وەردەگرێت.

const myPromise = new Promise((resolve, reject) => {
  let isReady = true;
  if (isReady) {
    resolve("سەرکەوتوو بوو!");
  } else {
    reject("شکستی هێنا!");
  }
});

لە نموونەکەی سەرەوەدا، ئەگەر isReady ڕاست بێت، بەڵێنەکە بە resolve کۆتایی دێت. هەڵەی باو لێرەدا ئەوەیە کە بیرت بچێت resolve یان reject بانگ بکەیت، کە ئەمەش دەبێتە هۆی ئەوەی بەڵێنەکە بۆ هەمیشە لە دۆخی pending بمێنێتەوە.

بەکاربردنی .then() و .catch()

دوای دروستکردنی بەڵێنەکە، دەبێت بەکاری بهێنین. بۆ ئەم مەبەستە .then() بۆ کاتی سەرکەوتن و .catch() بۆ کاتی شکست بەکاردێنین.

myPromise
  .then((message) => console.log("سەرکەوتن: " + message))
  .catch((error) => console.log("هەڵە: " + error))
  .finally(() => console.log("کارەکە تەواو بوو"));

بەکارهێنانی .finally() زۆر گرنگە کاتێک دەتەوێت کۆدێک جێبەجێ بکەیت بێ گوێدانە ئەوەی بەڵێنەکە سەرکەوتووە یان شکست. ئەمە بۆ داخستنی لۆدەر یان پاککردنەوەی داتا بەکاردێت.

بۆچی بەڵێنەکان بەکاردەهێنین؟

پێشتر ئێمە Callback-مان بەکاردەهێنا، بەڵام کاتێک چەندین کاری ئاسینکرۆن بەدوای یەکدا دێن، تووشی کێشەیەک دەبین کە پێی دەوترێت Callback Hell. بەڵێنەکان ئەمە چارەسەر دەکەن و کۆدەکە بە شێوەیەکی ڕیزبەندی (Chaining) دەخەنە ڕوو.

ئاگاداری: هەرگیز .then() یان .catch() لەبیر مەکە، چونکە ئەگەر بەڵێنێک شکست بهێنێت و تۆ .catch()-ت نەبێت، بەرنامەکەت ڕەنگە تووشی هەڵەی نەبینراو ببێت.

نموونەیەکی پراکتیکی: بەکارهێنانی setTimeout

لێرەدا بەڵێنێک دروست دەکەین کە دوای 2 چرکە داتایەک دەگەڕێنێتەوە:

const fetchData = new Promise((resolve) => {
  setTimeout(() => {
    resolve("داتاکە بە سەرکەوتوویی هات!");
  }, 2000);
});

fetchData.then(data => console.log(data));

ئەم نموونەیە پیشان دەدات کە چۆن بەڵێنەکان بۆ کارە ڕاستەقینەکان وەک پەیوەندی بە ئینتەرنێتەوە بەکاردێن.

ڕاهێنانی پراکتیکی

ئەرک: بەڵێنێک دروست بکە کە گۆڕاوێکی ژمارەیی بە ناوی score وەربگرێت. ئەگەر score لە 50 گەورەتر بوو، بەڵێنەکە resolve بکە بە پەیامی "سەرکەوتیت"، ئەگەر نا reject بکە بە پەیامی "دۆڕایت". پاشان بە .then() و .catch() ئەنجامەکەی لە کۆنسۆڵ چاپ بکە.