الوعود (Promises)
الكوب فقرة، #cup. يبدأ blank، والسكربت يكتب waiting قبل أن يطلب الشاي.
pour لا تُرجع المشروب. تُرجع وعدًا. تطلب من ذلك الوعد، عبر then، أن يكتب المشروب لاحقًا. السطر تحت pour ما زال يقول waiting. السطر waiting / lida tea.
ليس الكوب الذي قدّمته للتو
الصفحة السابقة مرّرت done إلى serve. serve نادت الدالة قبل الرجوع، فالسجل تحتها كان lida tea / poured. لم ينتظر شيء هناك.
هنا الدالة التي تعطيها لـ then لا تجري في السطر التالي. pour ترجع أولًا. المشروب يظهر بعد انتهاء هذا السكربت.
ثلاث حالات
الوعد pending حتى يستقر. resolve يُنجزه بقيمة. reject يرفضه بسبب. then يجري فقط عند الإنجاز. catch يجري فقط عند الرفض. لا مؤقت في هذه الصفحة. المنفّذ ينادي resolve أو reject فورًا، والمعالجات تنتظر حتى ينتهي السكربت.
📊 ثلاث حالات
| الحالة | ماذا ترى | سهل الخلط |
|---|---|---|
| pending | الكوب ما زال يقول waiting | المشروب على الكوب من قبل |
| fulfilled | then يستلم lida tea | أن يجري catch أيضًا |
| rejected | catch يستلم no leaves | أن يستلم then المشروب |
المنفّذ الآن، والمعالج ليس الآن
الدالة التي تعطيها لـ new Promise تجري فورًا. لذلك يمكن أن يحدث resolve("lida tea") قبل رجوع pour. الدالة التي تعطيها لـ then مختلفة. تُصفّ. السطر بعد pour(...) يجري والكوب ما زال يقول waiting.
السطر التالي ما زال ينتظر
pour("lida") يخزّن وعدًا في order. الكوب صار waiting. السجل تلك الكلمة، لا المشروب.
function pour(order) {
return new Promise(function (resolve, reject) {
if (order === "") {
reject("no leaves");
return;
}
resolve(order + " tea");
});
}
let cup = document.getElementById("cup");
cup.textContent = "waiting";
let order = pour("lida");
console.log(cup.textContent);
السجل waiting. order هو الوعد. ليس النص lida tea.
then يستلم المشروب
نادِ then بدالة. تلك الدالة تأخذ القيمة التي مُرّرت إلى resolve. تكتب المشروب وتسجّله. هذا السجل ليس سجل السطر التالي. هو السجل داخل then.
function pour(order) {
return new Promise(function (resolve, reject) {
if (order === "") {
reject("no leaves");
return;
}
resolve(order + " tea");
});
}
let cup = document.getElementById("cup");
pour("lida").then(function (drink) {
cup.textContent = drink;
console.log(cup.textContent);
});
السجل lida tea. النص الفارغ لا يصل إلى هذا المعالج.
لا أوراق شاي
pour("") تنادي reject("no leaves") وترجع. catch يستلم ذلك السبب. then لا يجري.
function pour(order) {
return new Promise(function (resolve, reject) {
if (order === "") {
reject("no leaves");
return;
}
resolve(order + " tea");
});
}
pour("").catch(function (reason) {
console.log(reason);
});
السجل no leaves.
الوعد ليس المشروب
order.then دالة. بذلك تعرف أن order وعد وليس النص الذي أردته. مقارنة الوعد بـ "lida tea" تكون خاطئة، وهذا المقطع يطبع نوع then فقط.
function pour(order) {
return new Promise(function (resolve, reject) {
if (order === "") {
reject("no leaves");
return;
}
resolve(order + " tea");
});
}
let order = pour("lida");
console.log(typeof order.then);
السجل function.
السطر تحت الكوب
السكربت يجعل الكوب waiting ويدفع تلك الكلمة فورًا. then يدفع lida tea ويجمع الكلمتين. الجمع داخل then، فيحدث بعد السكربت لا في السطر التالي.
<!DOCTYPE html>
<html>
<head>
<title>promised-cup — page</title>
</head>
<body>
<p id="cup">blank</p>
<p id="line">…</p>
<script>
function pour(order) {
return new Promise(function (resolve, reject) {
if (order === "") {
reject("no leaves");
return;
}
resolve(order + " tea");
});
}
let cup = document.getElementById("cup");
let seen = [];
cup.textContent = "waiting";
seen.push(cup.textContent);
pour("lida").then(function (drink) {
seen.push(drink);
cup.textContent = drink;
document.getElementById("line").textContent = seen.join(" / ");
});
</script>
</body>
</html>
السطر waiting / lida tea. waiting كان فوريًا. lida tea وصل في then. كلمة blank ذهبت. lida tea / poured هي الصفحة السابقة.
عند المنضدة
- اجعل الكوب waiting، ونادِ
pour("lida")، وسجّل الكوب فورًا. السجل waiting. - ضع المشروب على الكوب داخل
then. ذلك السجل lida tea. - نادِ
pour("")والتقط السبب بـcatch. السجل no leaves. - اقرأ
typeof order.then. السجل function. - اقرأ سطر الصفحة: waiting / lida tea.
أخطاء عند المنضدة
الكوب يقول waiting حتى يجري then. لا يقول poured.
- توقع أن السجل تحت
pourهو lida tea - معاملة القيمة المُرجعة كأنها نص المشروب
- استخدام
thenلطلب فارغ وتفويت no leaves - استخدام
catchلـ lida وتوقع no leaves - قراءة السطر كـ lida tea / poured
احتفظ بهذا
pourتُرجع وعدًا، لا النص lida tea- السطر التالي ما زال يسجّل waiting
thenيستلم lida tea بعد هذا السكربت- الطلب الفارغ يُرفض بـ no leaves، و
catchيسجّله - سطر الصفحة waiting / lida tea
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى