فهم async/await في Node.js

استكشف أساسيات async/await في Node.js مع دليلنا الشامل. فهم الوعود، وظائف async، معالجة الأخطاء، وأكثر لكتابة شفرة فعالة ونظيفة.

Amir Hassan

Amir Hassan

18 أغسطس 2025

فهم async/await في Node.js

يعتبر البرمجة غير المتزامنة في Node.js جزءًا أساسيًا من وظائفها، مما يمكّن العمليات غير المحجوزة وأداء فعال. لقد أحدثت صيغة async/await التي تم تقديمها في ES2017 ثورة في كيفية كتابة المطورين للشفرة غير المتزامنة.

فهم NodeJs

Node.js هو بيئة تشغيل جافا سكريبت تتيح لك تشغيل شفرة جافا سكريبت خارج متصفح الويب. يعتمد Node.js على محرك جافا سكريبت Google Chrome V8، ويستخدم لبناء تطبيقات الويب، لا سيما كثيفة البيانات وتطبيقات الوقت الحقيقي. كما تحتوي Node.js على مكتبة ضخمة من الوحدات والحزم التي يمكنك استخدامها لإضافة وظائف لمشاريعك. بعض فوائد Node.js هي:

NodeJs Website

ما هي الوعود؟

في جافا سكريبت، تعتبر الوعد كائنًا يمثل الاكتمال النهائي (أو الفشل) لعملية غير متزامنة وقيمتها الناتجة. يتيح لك العمل مع عملية غير متزامنة بشكل أكثر تزامنًا. إليك تفصيل لما هو الوعد وكيف يعمل:

الحالات: يكون الوعد في واحدة من هذه الحالات:

كيفية إعلان دالة غير متزامنة

إعلان دالة async في جافا سكريبت أمر بسيط للغاية. يكفي إضافة بادئة كلمة async إلى إعلان الدالة. هذا يشير إلى أن الدالة غير متزامنة ويمكن أن تحتوي على تعبيرات await واحدة أو أكثر. إليك الصيغة الأساسية:

async function functionName(parameters) {
  // جسم الدالة
}

إليك مثال لدالة async تسترجع البيانات من واجهة برمجة التطبيقات:

async function fetchData(url) {
  try {
    const response = await fetch(url);
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('حدث خطأ:', error);
  }
}

في هذا المثال، fetchData هي دالة async تستخدم await للانتظار لاستكمال استدعاء fetch قبل المتابعة. إذا كان استدعاء fetch ناجحًا، فإنها تعالج الاستجابة وترجع البيانات. إذا كان هناك خطأ، يتم التقاطه وتسجيله في وحدة التحكم.

ما هي Await؟

تُستخدم كلمة await في جافا سكريبت داخل دالة async لإيقاف تنفيذ الدالة حتى يتم حل Promise. عند استخدام await، تنتظر الدالة حتى تستقر Promise، ثم تستأنف التنفيذ مع نتيجة Promise. إذا تم رفض Promise، فإن التعبير await يقوم بإلقاء القيمة المرفوضة، مما يتيح لك التعامل معها باستخدام كتل try/catch.

إليك مثال بسيط لتوضيح await:

async function getUserData() {
  try {
    let response = await fetch('/user/data');
    let data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('حدث خطأ:', error);
  }
}

getUserData();

في هذا المثال، getUserData هي دالة async تسترجع بيانات المستخدم. تُستخدم كلمة await للانتظار لاستكمال استدعاء fetch قبل المتابعة إلى السطر التالي، والذي يستخدم أيضًا await للانتظار لاستكمال استدعاء response.json(). إذا تم رفض أي من هذه الوعود، سيتم التقاط الخطأ في كتلة catch.

لماذا استخدام Async/Await؟

توفر استخدام async و await في البرمجة، وخاصة في NodeJs، العديد من المزايا:

  1. تبسيط الشفرة غير المتزامنة: يسمح لك بكتابة شفرة غير متزامنة تبدو وتتصرف أكثر مثل الشفرة المتزامنة، مما يجعلها أسهل للفهم والصيانة.
  2. تحسين القراءة: من خلال تجنب حالة "جحيم الاستدعاء" أو "هرم الهلاك"، حيث لديك العديد من الاستدعاءات المتداخلة، تصبح الشفرة أنظف وأكثر قابلية للقراءة.
  3. معالجة الأخطاء: يمكّن من معالجة الأخطاء بشكل أفضل باستخدام كتل try/catch، مشابهة للشفرة المتزامنة، والتي ليست سهلة مع الأساليب التقليدية المعتمدة على الاستدعاءات.
  4. تدفق التحكم: يمنحك تحكمًا أفضل في تدفق العمليات غير المتزامنة، مما يتيح لك كتابة شفرة تنفذ بطريقة أكثر قابلية للتنبؤ.
  5. غير محجوزة: توقف await تنفيذ دالة غير متزامنة وتنتظر لحل الوعد دون حجز الخيط الرئيسي، مما يتيح استمرار تشغيل العمليات الأخرى في الخلفية.

معالجة الأخطاء باستخدام Async/Await

إن معالجة الأخطاء باستخدام async/await في جافا سكريبت هي بسيطة ومشابهة لمعالجة الأخطاء المتزامنة باستخدام كتل try/catch. إليك كيفية معالجة الأخطاء في دالة async:

async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('خطأ في استرجاع البيانات:', error);
  }
}

fetchData();

في المثال أعلاه، إذا فشل استدعاء fetch أو إذا كان هناك خطأ في تحليل JSON، سيتم التقاط الخطأ في كتلة catch. هذا يسمح بمعالجة الأخطاء مركزيًا، وهو مفيد بشكل خاص عند التعامل مع عمليات غير متزامنة متعددة.

تذكر، يمكن أن تحدث رفضات الوعد غير المعالجة إذا لم يتم التقاط الأخطاء بشكل صحيح. من المهم التأكد من أن كل وعد لديه معالج .catch() أو يكون ضمن كتلة try/catch في دالة async لتجنب مشاكل محتملة في تطبيقك.

Async/Await مع Apidog

Apidog ليس مجرد منصة لتطوير واجهات برمجة التطبيقات؛ بل هو مجموعة شاملة تسهل دورة حياة واجهات برمجة التطبيقات بالكامل. من خلال نهجه الذي يركز على التصميم، يضمن Apidog أن تكون واجهات برمجة التطبيقات الخاصة بك ليست فقط وظيفية ولكن أيضًا بديهية وسهلة الاستخدام.

يعمل استخدام async/await مع Apidog على تحسين كفاءة التعامل مع طلبات واستجابات واجهات برمجة التطبيقات. يتيح للمطورين كتابة شفرة أنظف وأسهل للقراءة، مما يجعل تصحيح الأخطاء أمرًا سهلاً.

Apidog Interface

الخاتمة

يعد async/await في Node.js ميزة قوية تبسط كتابة الشفرة غير المتزامنة. من خلال فهم واستخدام هذه الصيغة، يمكن للمطورين كتابة تطبيقات أكثر كفاءة،Readable ومتاحة للصيانة.

ممارسة تصميم API في Apidog

اكتشف طريقة أسهل لبناء واستخدام واجهات برمجة التطبيقات