0 تصويتات
منذ في تصنيف البرمجة بواسطة مجهول
ما الفرق بين Promise و Async Await؟

1 إجابة واحدة

0 تصويتات
منذ بواسطة admin6 (626ألف نقاط)

الفرق بين Promise و Async Await في جافاسكريبت

Promise و Async Await هما طريقتان للتعامل مع العمليات غير المتزامنة في جافاسكريبت، لكن لكل منهما أسلوبه الخاص من حيث التنظيم والوضوح. ببساطة، Promise هو كائن يمثل عملية غير متزامنة يمكن أن تكتمل أو تفشل في المستقبل، بينما Async Await هي طريقة حديثة تجعل الكتابة والتعامل مع العمليات غير المتزامنة أكثر سهولة ووضوحًا، اعتمادًا على Promises تحت الغطاء.

تعريف Promise

الـ Promise هو كائن يمكن أن يكون في ثلاثة حالات: معلقة (Pending)* مكتملة (Fulfilled)* أو مرفوضة (Rejected). يُستخدم Promise لتشغيل كود غير متزامن، مثل استدعاء API أو قراءة ملف، ثم استكمال العمليات بعد الانتهاء أو التعامل مع الأخطاء عند حدوثها. تتم معالجة الـ Promise عبر دوال مثل then() للنجاح و catch() للأخطاء.

مثال بسيط على Promise:

```javascript
fetch('url')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
```

تعريف Async Await

Async Await هي خاصية منهجية بناءً على Promises، وتُستخدم لجعل الكود غير المتزامن يبدو متزامنًا وأكثر سهولة في القراءة والكتابة. يسبق الكلمة المفتاحية async تعريف دالة، مما يجعلها تُعيد Promise تلقائيًا، بينما تستخدم await داخل تلك الدالة لانتظار اكتمال Promise قبل الانتقال للسطر التالي.

مزايا Async Await تكمن في حذف التعقيد الناتج عن تداخل عدة دوال then()* والتعامل المباشر مع الأخطاء باستخدام try...catch، مما يقلل من التعقيد ويحسن من قابلية صيانة الكود.

مثال على نفس العملية باستخدام Async Await:

```javascript
async function fetchData() {
try {
const response = await fetch('url');
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
fetchData();
```

مقارنة تفصيلية

سهولة القراءة والصياغة: الـ Async Await يجعل الكود أخف وأكثر تشابهًا مع الكود المتزامن التقليدي، مما يسهل تتبع تدفق التنفيذ. بينما استخدام Promises مع تعدد الـ then يمكن أن يؤدي إلى ما يُعرف بـ "callback hell" أو تداخل المكالمات، خصوصًا مع عمليات غير متزامنة معقدة.

التعامل مع الأخطاء: في Promises يحتاج المطور لاستخدام catch() لكل Promise غير متزامن، بينما Async Await يسمح باستخدام بلوك try...catch موحد لجميع العمليات التي تنتظرها.

الأداء: من حيث الأداء لا يوجد اختلاف كبير بين الطريقتين، حيث أن Async Await يستخدم Promises داخليًا. الاختلاف الأكبر هو في قابلية القراءة والتنظيم.

الدعم والتوافقية: Promises مدعومة بشكل جيد في المتصفحات الحديثة والبيئات البرمجية، وكذلك Async Await مدعومة على نطاق واسع، لكن Async Await قد لا تتوفر في بعض البيئات الأقدم بدون تحويل الكود (transpiling).

متى تختار أي منهما؟

إذا كنت تكتب كود بسيط أو عمليات غير متزامنة بسيطة، يمكن استخدام Promises بشكل مباشر. أما إذا كنت تتعامل مع عدة عمليات متسلسلة وتريد كود مرتب وواضح، فـ Async Await هو الخيار الأمثل لأنه يسهل عليك إدارة تدفق الكود والأخطاء.

بشكل عام، Async Await هو التطور الطبيعي والطريقة المفضلة في كتابة الكود غير المتزامن في جافاسكريبت حاليًا، مع الاحتفاظ بأساس Promises في خلفية التنفيذ.

مرحبًا بك في موقع اسألني، منصة عربية متخصصة في طرح الأسئلة والإجابة عليها. يمكنك بسهولة طرح أي سؤال يدور في ذهنك، وسيقوم مجتمع المستخدمين بمساعدتك من خلال تقديم إجابات مفيدة ومعلومات قيّمة في مختلف المجالات.
...