الدالة Promise.prototype.finally()
في JavaScript
الدالة finally()
تعيد وعدًا Pormise
، وعندما تُقرَّر قيمة الوعد، سواءً كان مقبولًا أو مرفوضًا، فستُنفَّذ دالة رد النداء (callback) المُحدَّدة. وهذا ما يوفِّر طريقة لتنفيذ شيفرة ما بعد التعامل مع كائن Pormise
سواءً كان الوعد مقبولًا أو مرفوضًا.
تسمح هذه الدالة لنا بتفادي تكرار الشيفرات في دوال then()
و catch()
.
البنية العامة
p.finally(onFinally);
p.finally(function() {
// قُرِّرَت قيمة الوعد، سواءً كان مقبولًا أم مرفوضًا
});
المعاملات
onFinally
الدالة التي ستُستدعى عند تقرير قيمة الوعد.
القيمة المعادة
كائن Pormise
الذي تكون دالة معالجة onFinally
فيه مضبوطةً إلى الدالة المُحدَّدة.
الوصف
يمكن أن تكون الدالة finally()
مفيدةً إذا كنتُ تريد إجراء بعض عمليات المعالجة أو «التنظيف» بعد تقرير قيمة الوعد، بغض النظر عنها.
الدالة finally()
شبيهة جدًا باستدعاء .then(onFinally, onFinally)
، لكن هنالك بعض الاختلافات:
- عند تمرير دالة مجهولة وإنشائها موضعًا، فعليك تمريرها مرةً واحدةً، بدلًا من تعريفها مرتين، أو إسنادها إلى متغير.
- لن تستقبل دالة رد النداء
finally
أي وسيط، وذلك لأنه لا توجد طرائق عملية لتحديد إذا كان الوعد قد تحقق أم رُفِض. وهذه الحالة تعني أنَّك لا تلقي بالًا لسبب الرفض أو قيمة تحقيق الوعد، لذا لا حاجة لتوفيرها إلى دالة رد النداء. - على العكس من
Promise.resolve(2).then(() => {}, () => {})
(والتي ستُقبَل مع القيمةundefined
)، التعبيرPromise.resolve(2).finally(() => {})
ستُقبَل مع القيمة 2. - وبشكل مشابه، على النقيض من
Promise.reject(3).then(() => {}, () => {})
(التي ستُحقَّق مع القيمةundefined
)، التعبيرPromise.reject(3).finally(() => {})
سيُرفَض مع القيمة 3.
ملاحظة: استخدام throw
(أو إعادة وعد مرفوض) في دالة رد النداء finally
سيؤدي إلى رفض الوعد الجديد مع السبب المُحدَّد مع throw()
.
أمثلة
مثال على استعمال الدالة finally()
:
let isLoading = true;
fetch(myRequest).then(function(response) {
var contentType = response.headers.get("content-type");
if(contentType && contentType.includes("application/json")) {
return response.json();
}
throw new TypeError("Oops, we haven't got JSON!");
})
.then(function(json) { /* process your JSON further */ })
.catch(function(error) { console.log(error); })
.finally(function() { isLoading = false; });
انظر أيضًا
- الدالة
then()
: تعيد وعدًاPromise
، وتأخذ وسيطين على الأكثر، وهما دالتا رد النداء (callback) لنجاح أو فشل الوعد. - الدالة
catch()
: تعيد وعدًاPromise
وتتعامل مع حالات رفض الوعود فقط.