الدالة Promise.prototype.finally()‎ في JavaScript

من موسوعة حسوب
مراجعة 12:58، 19 أبريل 2019 بواسطة جميل-بيلوني (نقاش | مساهمات) (إنشاء الصفحة. هذه الصفحة من مساهمات عبد اللطيف ايمش)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الدالة 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 وتتعامل مع حالات رفض الوعود فقط.

المصادر