{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “جافا سكريبت غير المتزامن في انتظار مقابل الوعد ثم: الدليل الكامل مع أمثلة حقيقية”,
“description”: “افهم بناء الجملة async/await vs Promise.then، ومتى تستخدم كل منهما، والمزالق الشائعة مع أمثلة التعليمات البرمجية التي تغطي كل نمط من أنماط العالم الحقيقي.”,
“url”: “https://techpulsesite.com/javascript-async-await-vs-promise-then-c-ar/”,
“datePublished”: “2026-06-24T16:50:00+00:00”,
“dateModified”: “2026-06-29T04:14:50+00:00”,
“author”: {
“@type”: “Organization”,
“name”: “TechPulse Editorial Team”,
“url”: “https://techpulsesite.com”
},
“publisher”: {
“@type”: “Organization”,
“name”: “TechPulse”,
“url”: “https://techpulsesite.com”
},
“inLanguage”: “ar”
}
{
“@context”: “https://schema.org”,
“@type”: “TechArticle”,
“headline”: “جافا سكريبت غير المتزامن في انتظار مقابل الوعد ثم: الدليل الكامل مع أمثلة حقيقية”,
“description”: “افهم بناء الجملة async/await vs Promise.then، ومتى تستخدم كل منهما، والمزالق الشائعة مع أمثلة التعليمات البرمجية التي تغطي كل نمط من أنماط العالم الحقيقي.”,
“url”: “https://techpulsesite.com/javascript-async-await-vs-promise-then-c-ar/”,
“datePublished”: “2026-06-24T16:50:00+00:00”,
“dateModified”: “2026-06-21T05:56:43+00:00”,
“author”: {
“@type”: “Organization”,
“name”: “TechPulse Editorial Team”,
“url”: “https://techpulsesite.com”
},
“publisher”: {
“@type”: “Organization”,
“name”: “TechPulse”,
“url”: “https://techpulsesite.com”
},
“inLanguage”: “ar”
}
جافا سكريبتغير متزامن/في انتظار وPromise.then() كلاهما يتعامل مع العمليات غير المتزامنة – لكن لديهما نقاط قوة مختلفة، وملفات تعريف مختلفة لقابلية القراءة، وأنماط مختلفة لمعالجة الأخطاء. يغطي هذا الدليل متى يتم استخدام كل منها مع أمثلة التعليمات البرمجية الحقيقية.
📋 Table of Contents
ما هي المشكلة التي نحلها؟
JavaScript عبارة عن خيط واحد ولكنه يتعامل مع عمليات الإدخال / الإخراج بشكل غير متزامن. بدون طريقة “لانتظار” العمليات غير المتزامنة، ستحصل على جحيم رد الاتصال – وهي وظائف متداخلة يستحيل قراءتها وصيانتها. الوعود حلت ذلك. async/await جعلها تبدو متزامنة. وكلاهما ضروري لفهم.
Promise.then() بناء الجملة
// Basic promise chain
fetch('https://api.example.com/users')
.then(response => response.json())
.then(users => {
console.log(users);
return fetch(`/api/posts/${users[0].id}`);
})
.then(response => response.json())
.then(posts => console.log(posts))
.catch(error => console.error('Error:', error))
.finally(() => console.log('Done'));
سلاسل الوعد قابلة للقراءة للتدفقات الخطية البسيطة. كل.then() يتلقى القيمة التي تم حلها من الخطوة السابقة.
غير متزامن/في انتظار بناء الجملة
// Same logic with async/await
async function fetchUserPosts() {
try {
const userResponse = await fetch('https://api.example.com/users');
const users = await userResponse.json();
const postsResponse = await fetch(`/api/posts/${users[0].id}`);
const posts = await postsResponse.json();
console.log(posts);
} catch (error) {
console.error('Error:', error);
} finally {
console.log('Done');
}
}
fetchUserPosts();
async/await يستخدم محاولة/التقاط الأخطاء بشكل منتظم ويقرأ من الأعلى إلى الأسفل مثل التعليمات البرمجية المتزامنة – وهو أسهل بكثير في المتابعة بالنسبة للمنطق المعقد.
جنبًا إلى جنب: أيهما أكثر قابلية للقراءة؟
| السيناريو | Promise.then() | غير متزامن/في انتظار | الفائز |
|---|---|---|---|
| مكالمة واحدة غير متزامنة | نظيف | يحتاج إلى وظيفة غير متزامنة | ربطة عنق |
| عمليات متسلسلة | السلسلة تطول | يقرأ بشكل طبيعي | غير متزامن/في انتظار |
| العمليات الموازية | Promise.all() طبيعي | تحتاج إلى Promise.all() أيضًا | ربطة عنق |
| خطأ في التعامل | .catch() سهل | حاول/تعرف على | ربطة عنق |
| المنطق الشرطي | فوضوي داخل .then() | منتظم إذا كان يعمل | غير متزامن/في انتظار |
| التصحيح | تتبع المكدس أصعب | آثار مكدس أفضل | غير متزامن/في انتظار |
تشغيل العمليات على التوازي
// WRONG: These run sequentially (slow)
async function slowFetch() {
const users = await fetchUsers(); // waits 500ms
const posts = await fetchPosts(); // then waits 500ms = 1000ms total
}
// RIGHT: Run in parallel with Promise.all
async function fastFetch() {
const [users, posts] = await Promise.all([
fetchUsers(), // both start at same time
fetchPosts() // total: ~500ms
]);
return { users, posts };
}
// Promise.then() approach for parallel:
Promise.all([fetchUsers(), fetchPosts()])
.then(([users, posts]) => ({ users, posts }))
.catch(console.error);
أنماط معالجة الأخطاء
// async/await: catch specific errors
async function getUser(id) {
try {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error(`HTTP error: ${response.status}`);
}
return await response.json();
} catch (error) {
if (error.message.includes('HTTP error: 404')) {
return null; // user not found
}
throw error; // rethrow unexpected errors
}
}
// Promise.then(): chain error catching
fetch(`/api/users/${id}`)
.then(response => {
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return response.json();
})
.catch(error => {
if (error.message.includes('404')) return null;
throw error;
});
أخطاء شائعة يجب تجنبها
- نسيان الانتظار:
const data = fetch(url)يمنحك كائن Promise، وليس البيانات. دائماawaitهو – هي. - انتظر داخل .then(): لا يمكنك استخدام
awaitداخل رد الاتصال العادي. قم بوضع علامة على رد الاتصال كـasync. - المسلسل بدلاً من الموازي: متسلسل
awaitالمكالمات عندما تكون العمليات مستقلة. استخدمPromise.all(). - نسيان معالجة الأخطاء: تؤدي حالات رفض الوعود التي لم يتم اكتشافها إلى تعطل عمليات Node.js وإظهار الأخطاء الحمراء في المتصفحات.
- منع حلقة الحدث:
awaitيعلق الوظيفة، وليس الموضوع بأكمله. رمز آخر لا يزال قيد التشغيل.
نمط العالم الحقيقي: فئة خدمة API
class ApiService {
constructor(baseUrl) {
this.baseUrl = baseUrl;
}
async request(endpoint, options = {}) {
const response = await fetch(`${this.baseUrl}${endpoint}`, {
headers: { 'Content-Type': 'application/json', ...options.headers },
...options
});
if (!response.ok) throw new Error(`API Error: ${response.status}`);
return response.json();
}
async getUser(id) { return this.request(`/users/${id}`); }
async createPost(data) { return this.request('/posts', { method: 'POST', body: JSON.stringify(data) }); }
async updatePost(id, data) { return this.request(`/posts/${id}`, { method: 'PUT', body: JSON.stringify(data) }); }
}
الأسئلة المتداولة
س: هل يعد المزامنة/الانتظار مجرد سكر نحوي فوق الوعود؟
ج: نعم. تحت الغطاء،async وظائف إرجاع الوعود وawait يوقف التنفيذ مؤقتًا حتى يتم حل الوعد. يتم تجميعها لنفس الشيء في البيئات القديمة.
س: هل يمكنني مزج async/await و.then() في نفس قاعدة التعليمات البرمجية؟
ج: نعم، وأحيانا يكون ذلك مناسبا. قد تقوم وظيفة الأداة المساعدة بإرجاع وعد؛ يستخدم المكون async/await للاتصال به. كن متسقًا داخل الوظائف.
س: هل يعمل المزامنة/الانتظار في جميع المتصفحات في عام 2026؟
ج: نعم. تدعم كافة المتصفحات الحديثة المزامنة/الانتظار أصلاً. ليست هناك حاجة إلى الترجمة إلا إذا كنت تدعم IE11 (وهو ما لا ينبغي عليك فعله في عام 2026).
س: ماذا عن المولدات غير المتزامنة للبث؟
A: for await...of مع المولدات غير المتزامنة ممتازة للتعامل مع استجابات البث. استخدمه مع ReadableStream الخاص بـ Fetch API للبيانات المقسمة.
س: ما الذي يجب أن أعلمه للمبتدئين؟
ج: قم بتدريس مفاهيم Promise أولاً حتى يفهموا ما يحدث، ثم قم بتعليم async/await باعتباره بناء الجملة المفضل. إن فهم الوعود يجعل تصحيح الأخطاء غير المتزامن/الانتظار أسهل بكثير.
الخلاصة
في عام 2026،المزامنة/الانتظار هو الخيار الافتراضي بالنسبة للتعليمات البرمجية الجديدة – فهي أكثر قابلية للقراءة، وأسهل في تصحيح الأخطاء، وتعمل بشكل طبيعي مع المحاولة/التقاط. استخدمPromise.then() عندما يكون التسلسل أنظف (تحويلات بسيطة) أو عندما تحتاج إلى تحكم دقيق مثلPromise.race() وPromise.allSettled(). كلتا المهارتين ضروريتان، فإتقان جافا سكريبت غير المتزامن أمر غير قابل للتفاوض بالنسبة لأي مطور جافا سكريبت حديث.
🔗 Share this article
✍️ Leave a Comment