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

الأمر ليس بهذه الصعوبة! لفهم "الوعد" في جافا سكريبت

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

It’s not that hard! To understand `Promise` in javascript

محتوى هذه المقالة مناسب جدًا للمبتدئين في Javascript. سيتم وصفها بلغة بسيطة وسهلة الفهم، لذلك لا داعي للقلق بشأن عدم فهمها.

وعد لماذا أنت موجود؟

الوعد هو نقطة معرفة لا غنى عنها عند تعلم لغة جافا سكريبت الحديثة. يشعر الكثير من الناس بالارتباك عند قراءته. والسبب الرئيسي يمكن تلخيصه في جملة واحدة:

لم يعد يتم تنفيذ الكود من الأعلى إلى الأسفل.

عادة، يتم تنفيذ الكود الذي نكتبه بشكل تسلسلي، على سبيل المثال، نكتب كودًا يتم حسابه من 1 إلى 3.

console.log(1)
console.log(2)
console.log(3)

اضغط على F12 لفتح وحدة التحكم في متصفحنا، وانسخ الكود أعلاه فيه، ثم اضغط على Enter، ويمكنك أن ترى أن الأرقام من 1 إلى 3 مطبوعة بالترتيب.

1
2
3

الآن، إذا كان لدينا متطلب يقضي بعدم إمكانية تغيير ترتيب الرموز، ولكن يجب أن يكون ترتيب المطبوعات النهائية مستقلاً عن ترتيب الرموز، فهل يمكننا القيام بذلك؟

لنتخيل أنه إذا تمت طباعة الأرقام 1 و2 و3 بواسطة ثلاثة أشخاص على التوالي، فسيكون الأمر بسيطًا للغاية. نحتاج فقط أن نخبرهم بمهمة طباعة الأرقام في نفس الوقت، وسيكون ترتيب المطبوعات مرتبطًا فقط بوقت تنفيذ المهام.

وعد، التأثير السحري

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

الوعد، تعليمات التجميع

كما قلنا للتو، وعد بأنه يمكن اعتبارها "عملية" جديدة، لذلك إذا أردنا تنفيذ أي كود، فيمكننا تغليفها في وظيفة وإعطائها لها. بهذه الطريقة لن يتم تنفيذ التعليمات البرمجية على الفور.

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

Promise(
  (resolve, _reject) => {
    setTimeout(() => {
      console.log(1)
      resolve()
    }, 300)
  }
)

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

رمز كامل

ثم نتبع نفس الطريقة، ونعد عندما نقوم بتجميع الاثنين الآخرين، نحتاج فقط إلى تزويدهم بأرقام طباعة مختلفة والوقت اللازم للمهمة. أخيرًا، الكود الكامل هو مثل هذا، يمكنك محاولة نسخه إلى وحدة التحكم وتجربته.

Promise(
  (resolve, _reject) => {
    setTimeout(() => {
      console.log(1)
      resolve()
    }, 300)
  }
)
new Promise(
  (resolve, _reject) => {
    setTimeout(() => {
      console.log(2)
      resolve()
    }, 200)
  }
)
new Promise(
  (resolve, _reject) => {
    setTimeout(() => {
      console.log(3)
      resolve()
    }, 100)
  }
)

أخيرًا، ترتيب طباعة الأرقام مرتبط بزمن تنفيذ المهام:

3
2
1

الوعد، نموذج التزامن

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

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/linjiezhang/its-not-that-hard-to-understand-promise-in-javascript-3kk3?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3