تريد إنهاء التنظيف بعد المهمة، ثم مواصلة العمل بنتيجتها. تسمح finally بذلك، لكن قيمة التنظيف المعادة ليست بديلًا مباشرًا لنتيجة المهمة. [1]
استخدم finally للتنظيف؛ يمرّر الوعد التالي النتيجة الأصلية إذا نجح التنظيف، ويتأخر عند انتظار وعد التنظيف أو يُرفض إذا فشل. [1] [3]
الخلاصة السريعة
- تعمل finally بعد نجاح الوعد أو رفضه، ولا تتلقى نتيجته؛ إرجاع قيمة عادية لا يستبدل النتيجة الأصلية. [1]
- يستقبل معالج النجاح في then القيمة الأصلية، وتصبح القيمة التي يعيدها نتيجة الوعد التالي. [2]
- إذا رمى التنظيف خطأً أو أعاد وعدًا مرفوضًا، يُرفض الوعد التالي بسبب فشل التنظيف. [3]
- إذا أعاد التنظيف وعدًا معلّقًا، تنتظر السلسلة استقراره؛ نجاحه يعيد تمرير النتيجة الأصلية. [3]
ابدأ بتنظيف يعيد رقمًا
تعمل finally بعد نجاح الوعد أو رفضه، ولا تتلقى نتيجته؛ إرجاع قيمة عادية لا يستبدل النتيجة الأصلية. [1]
نفّذ المقاطع بالترتيب في وحدة تحكم تدعم await مباشرة. يعيد التنظيف هنا 99، لكن kept يبقى 17. لا تستخدم هذه القيمة المعادة لتعديل ناتج المهمة. [1]
مرّر الشيفرة أفقيًا عند الحاجة.
const kept = await Promise.resolve(17).finally(() => 99);
console.log(kept); // 17قارن ذلك بتحويل النتيجة عبر then
يستقبل معالج النجاح في then القيمة الأصلية، وتصبح القيمة التي يعيدها نتيجة الوعد التالي. [2]
يعيد المثال التالي 99 صراحة؛ لذلك يتغير الناتج. وإذا أردت تحويل القيمة الواردة، فاكتب وسيطًا للمعالج واستعمله في الحساب، بدل تجاهله كما تفعل الدالة القصيرة هنا. [2]
هذه المقارنة تخص القيمة التي يعيدها معالج النجاح. إرجاع وعد من then يجعل الوعد التالي يتبع نتيجته، ورمي خطأ يرفضه. [2]
مرّر الشيفرة أفقيًا عند الحاجة.
const changed = await Promise.resolve(17).then(() => 99);
console.log(changed); // 99لاحظ أي خطأ يصل بعد التنظيف
إذا رمى التنظيف خطأً أو أعاد وعدًا مرفوضًا، يُرفض الوعد التالي بسبب فشل التنظيف. [3]
رغم أن المهمة الأصلية مرفوضة بالسبب original، يصل الخطأ cleanup إلى المعالج التالي. فشل التنظيف قد يحجب السبب السابق؛ افحص المسار الذي يرمي هذا الخطأ. [3]
مرّر الشيفرة أفقيًا عند الحاجة.
await Promise.reject("original")
.finally(() => { throw new Error("cleanup"); })
.then(console.log, error => console.log(error.message));
// cleanupاختبر الانتظار ببوابة تتحكم فيها
إذا أعاد التنظيف وعدًا معلّقًا، تنتظر السلسلة استقراره؛ نجاحه يعيد تمرير النتيجة الأصلية. [3]
أنشئ gate واحفظ دالة تحقيقه في finish. ينفّذ منشئ Promise الدالة الممرّرة إليه فورًا، لكن الوعد يبقى معلّقًا حتى تستدعي دالة التحقيق. هذه بوابة تعليمية؛ لا تحتاج عادةً إلى إنشاء وعد جديد لمهمة تعيد وعدًا أصلًا. [4]
نفّذ سطر إنشاء pending أولًا، ثم توقف قبل finish. بعد استدعائها يتحقق gate بالقيمة 99، بينما يمرّر pending القيمة الأصلية 17. [3] [4]
مرّر الشيفرة أفقيًا عند الحاجة.
let finish;
const gate = new Promise(resolve => { finish = resolve; });مرّر الشيفرة أفقيًا عند الحاجة.
const pending = Promise.resolve(17).finally(() => gate);
finish(99);
console.log(await pending); // 17المصادر ومتابعة القراءة
- MDN: سلوك finally (يفتح في نافذة جديدة)developer.mozilla.org
- MDN: القيمة المعادة من then (يفتح في نافذة جديدة)developer.mozilla.org
- ECMAScript: خوارزمية finally (يفتح في نافذة جديدة)tc39.es
- MDN: منشئ Promise (يفتح في نافذة جديدة)developer.mozilla.org
أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.