"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > شبيبة: وعد أو رد الاتصال؟

شبيبة: وعد أو رد الاتصال؟

تم النشر بتاريخ 2024-11-02
تصفح:787

JS: Promise or Callback?

فهم الوعود مقابل عمليات الاسترجاعات في JavaScript

الأسئلة والأجوبة الرئيسية لاختبار الشهادة

  1. ما هي وظيفة رد الاتصال، وكيف تختلف عن الوظيفة العادية؟

    • يتم تمرير وظيفة رد الاتصال كوسيطة إلى وظيفة أخرى ويتم استدعاؤها للتعامل مع العمليات غير المتزامنة. على عكس الوظائف العادية، تم تصميم عمليات الاسترجاعات ليتم تنفيذها بعد اكتمال مهمة معينة.
  2. كيف تعمل الوعود على تحسين إمكانية قراءة التعليمات البرمجية وإدارة العمليات غير المتزامنة مقارنة بعمليات الاسترجاعات؟

    • تسمح الوعود بالتسلسل ومعالجة الأخطاء بشكل أفضل، مما يؤدي إلى كود أكثر قابلية للقراءة والصيانة. إنها تساعد في تجنب الهياكل المتداخلة بشدة والمعروفة باسم "جحيم رد الاتصال".
  3. ما هي الحالات الرئيسية للوعد، وكيف تنتقل بين هذه الحالات؟

    • الحالات الرئيسية هي: معلق (الحالة الأولية)، تم التنفيذ (اكتملت العملية بنجاح)، ومرفوض (فشلت العملية). ينتقل الوعد من معلق إلى منفذ أو مرفوض.
  4. كيف يمكنك التعامل مع الأخطاء باستخدام الوعود، وكيف يمكن مقارنة ذلك بمعالجة الأخطاء من خلال عمليات رد الاتصال؟

    • توفر الوعود طريقة التقاط للتعامل مع الأخطاء بطريقة مبسطة، في حين أن معالجة الأخطاء باستخدام عمليات رد الاتصال غالبًا ما تتطلب تمرير كائنات الخطأ وعمليات التحقق المتعددة في عمليات رد الاتصال المتداخلة.
  5. ما الفرق بين Promise.all وPromise.race، ومتى تستخدم كل منهما؟

    • يتم حل Promise.all عندما يتم حل كافة وعود الإدخال، مما يجعله مفيدًا في انتظار اكتمال العمليات غير المتزامنة المتعددة. يتم حل Promise.race بمجرد حل أحد وعود الإدخال، وهو مفيد للسيناريوهات التي تتطلب نتيجة العملية المكتملة الأولى.
  6. كيف تعمل صيغة المزامنة/الانتظار على تبسيط العمل مع Promises، وما هي قواعد استخدام الانتظار؟

    • يسمح بناء الجملة غير المتزامن/الانتظار بكتابة تعليمات برمجية غير متزامنة بطريقة متزامنة، مما يحسن إمكانية القراءة. لا يمكن استخدام الانتظار إلا داخل وظائف غير متزامنة ويوقف التنفيذ مؤقتًا حتى يتم حل الوعد.

مقدمة

في المشهد المتطور لجافا سكريبت، تعد إدارة العمليات غير المتزامنة بكفاءة أمرًا أساسيًا لبناء تطبيقات ويب عالية الأداء. في حين أن عمليات رد الاتصال كانت هي الطريقة الأصلية، فقد قدمت Promises طريقة أكثر تنظيمًا وقابلة للقراءة للتعامل مع المهام غير المتزامنة. تتعمق هذه المدونة في تعقيدات استخدام الوعود مقابل عمليات رد الاتصال، على افتراض أن لديك بالفعل فهمًا أساسيًا لهذه المفاهيم.

فوائد الوعود على عمليات الاسترجاعات

تحسين إمكانية القراءة وقابلية الصيانة

عمليات الاسترجاعات، على الرغم من أنها وظيفية، غالبًا ما تؤدي إلى هياكل متداخلة للغاية تُعرف باسم "جحيم رد الاتصال"، مما يجعل من الصعب قراءة التعليمات البرمجية وصيانتها.

مثال على رد الاتصال الجحيم:
fetchData(function(response1) {
  fetchMoreData(response1, function(response2) {
    fetchEvenMoreData(response2, function(response3) {
      console.log(response3);
    });
  });
});
تحسين مع الوعود:
fetchData()
  .then(response1 => fetchMoreData(response1))
  .then(response2 => fetchEvenMoreData(response2))
  .then(response3 => console.log(response3))
  .catch(error => console.error(error));

معالجة الأخطاء

مع عمليات الاسترجاعات، يمكن أن تصبح معالجة الأخطاء مرهقة لأنك تحتاج إلى تمرير كائنات الخطأ والتعامل معها على كل مستوى.

معالجة الأخطاء باستخدام عمليات الاسترجاعات:
function fetchData(callback) {
  setTimeout(() => {
    if (/* error condition */) {
      callback(new Error('An error occurred'), null);
    } else {
      callback(null, 'data');
    }
  }, 1000);
}

fetchData((error, data) => {
  if (error) {
    console.error(error);
  } else {
    console.log(data);
  }
});
معالجة الأخطاء بالوعود:
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (/* error condition */) {
        reject(new Error('An error occurred'));
      } else {
        resolve('data');
      }
    }, 1000);
  });
}

fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error));

أساليب الوعد المتقدمة

وعد.كل

يكون Promise.all مفيدًا عندما تحتاج إلى الانتظار حتى تكتمل العمليات المتعددة غير المتزامنة قبل المتابعة.

مثال:
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).then(values => {
  console.log(values); // [3, 42, "foo"]
});

وعد.سباق

Promise.race مفيد عندما تحتاج إلى نتيجة أسرع عملية.

مثال:
const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 'one');
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(value => {
  console.log(value); // "two"
});

تبسيط التعليمات البرمجية غير المتزامنة باستخدام المزامنة/الانتظار

يسمح لك بناء الجملة غير المتزامن/الانتظار بكتابة تعليمات برمجية غير متزامنة تبدو متزامنة، مما يعزز إمكانية القراءة ويقلل من تعقيد تسلسل الوعود.

مثال:
async function fetchData() {
  return 'data';
}

async function processData() {
  try {
    const data = await fetchData();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
}

processData();

خاتمة

بينما أرست عمليات رد الاتصال الأساس للتعامل مع العمليات غير المتزامنة في JavaScript، فقد ساهمت Promises بشكل كبير في تحسين إمكانية القراءة وقابلية الصيانة وقدرات معالجة الأخطاء للتعليمات البرمجية غير المتزامنة. يعد فهم كيفية ووقت استخدام هذه الأدوات بفعالية أمرًا بالغ الأهمية لتطوير JavaScript الحديث. باستخدام Promises وبناء الجملة غير المتزامن/الانتظار، يمكن للمطورين كتابة تعليمات برمجية أكثر وضوحًا وأكثر قابلية للإدارة، مما يمهد الطريق لتطبيقات أكثر قوة.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/dariansdev/js-promise-or-callback-704?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3