نتعلم الوعود بناءً على مواصفات Ecmascript. معرفة

الوعد مقدمة

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


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


لن أصف ما حاولنا قراءته ومشاهدته. نتيجة لذلك ، أصبحنا مهتمين بمواصفات ECMAScript. كيفية قراءتها وفهمها هي محادثة منفصلة (ربما حتى مشاركة منفصلة). لكن الطريقة التي يتم بها وصف الوعود وسلوكهم هناك ، ولأول مرة أعطتنا فهمًا كليًا ومتماسكًا منطقيًا لهذا الموضوع. ما أريد أن أشاطركم.


هذه المقالة للمبتدئين. الوعود من حيث مواصفات ECMAScript سوف تناقش هنا. أعلم أن هذا يبدو غريباً ، لكن كما هو.


كائن الوعد: فلسفته ، عرضه الفني ، حالاته الممكنة


لقد لاحظت بالفعل أكثر من مرة أن التدريب على البرمجة عالية الجودة يجب أن يتكون من جزأين. هذا فهم فلسفي للفكرة ، وعندها فقط تنفيذها التقني. وهذا هو ، أن المنطق الإنساني المعتاد ، والذي يسترشد به الطالب عند اتخاذ أي قرارات ، يسهل إلى حد كبير فهم التنفيذ الفني لهذا القرار. لذلك ، نبدأ مع ما هو الوعد في الحياة ، وكيف نتصل به؟ وبعد ذلك سنرى: كيف سيتم تنفيذ أمثلة من الوعود في التعليمات البرمجية. النظر في الأشكال التالية (الشكل 1 ، 2 ، 3).


الوعد الدولة
الشكل 1. ([[PromiseState]] - نتيجة الوعد)

نتيجة الوعد
الشكل 2. ([[PromiseResult]] - كمعلومات متعلقة بنتيجة الوعد الذي تم الوفاء به أو غير المحققة)

ردود الفعل الوعد
الشكل 3. ([[[PromiseFulfillReactions]] ، [[PromiseRejectReactions]] - كعواقب تحدث بعد الوفاء أو عدم الوفاء بالوعد)

نرى أن مفهوم الوعد ذاته يقف على 3 أعمدة. 1) هل تم الوفاء بالوعد على الإطلاق؟ 2) ما هي المعلومات الإضافية التي يمكن أن نستخلصها بعد الوفاء أو رفض الوعد؟ 3) ما هي العواقب إذا كان وعدنا إيجابي أم سلبي؟


من الناحية الفنية ، يعد الوعد كيانًا عاديًا يتم التعبير عنه من خلال نوع بيانات مثل كائن. هذا الكيان لديه اسم / فئة وعد. تحتوي الكائنات المولودة من هذه الفئة على Promise.prototype في سلسلة النموذج الأولي الخاصة بها. ويجب أن يرتبط هذا الكيان بطريقة أو بأخرى بجميع "المعلومات من الحياة" التي درسناها أعلاه. تحدد مواصفات ECMAScript هذه المعلومات بوعد حتى عند مستوى أقل في التجريد من JavaScript نفسها. على سبيل المثال ، على مستوى C ++. وفقًا لذلك ، في موضوع الوعد ، يوجد مكان تحت الوضع وتحت النتيجة وتحت عواقب الوعد. ألق نظرة على ما يتكون وعد ECMAScript من (الشكل 4).


حقول الوعد
الشكل 4. (الحقول الداخلية لكائن الوعد وفقا لمواصفات ECMAScript)

ما هي الألوان الجديدة التي لعبتها عبارة "الوعد لا يعني الزواج" من حيث المبرمج؟ 1) [[PromiseState]]. شخص ما لم يتزوج. 2) [[PromiseResult]]. لأنه لم يكن لديه ما يكفي من المال لحفل الزفاف. 3) [[PromiseRejectReactions]]. نتيجة لذلك ، كان لديه الكثير من وقت الفراغ الذي قضاه في تطوير الذات 4) [[PromiseFulfillReactions]]. لماذا يحتاج الشخص إلى الخطة "ب" عندما يكون قد اختار بالفعل الخطة "أ"؟


نعم ، هناك مجال خامس [[PromiseIsHandled]]. هذا ليس مهمًا جدًا بالنسبة لنا نحن الأشخاص ، ولن نواصل العمل عليه في المستقبل. باختصار: يتم تخزين إشارة للمترجم الشفهي حول ما إذا كان المبرمج قد تم رفض الوعد أم لا. إذا لم يكن كذلك ، فسيتم تفسير رفض الوعد الأولي بواسطة محرك JS كخطأ. بالنسبة للآخرين غير الصبور: إذا لم يبرمج المبرمج وظيفة Promise.prototype.then () باعتباره معالج استدعاء الوظيفة الثاني للحالة المرفوضة من الوعد ، فإن حالة الوعد "المرفوضة" للكائن ستظهر لك خطأ أحمر في وحدة تحكم المطور.


هل لاحظت أن حقول كائن الوعد مرفقة في "[[" و "]]"؟ هذا يؤكد أن مبرمج JS ليس لديه وصول مباشر إلى هذه المعلومات. فقط من خلال الأدوات / الأوامر / API الخاصة ، مثل الأمر Promise.prototype.then (). إذا كانت لديك رغبة لا تقاوم في التحكم في "هذا المطبخ" مباشرةً ، فمرحباً بك في نادي معايير مواصفات EcmaScript.


ملاحظة قصيرة في نهاية هذا الفصل الفرعي. إذا كانت الوعود في الحياة في بلادنا يمكن الوفاء بها جزئيًا ، فعندئذٍ في EcmaScript - لا. هذا هو ، إذا وعد شخص ما بتقديم مليون ، وقدم 950 ألفًا ، ثم في الحياة ، ربما يكون شريكًا موثوقًا به ، ولكن بالنسبة إلى جافا سكريبت ، سيتم إدراج هذا المدين في القائمة السوداء من خلال [[PromiseState]] === "مرفوض". كائن الوعد يغير حالته بشكل لا لبس فيه ومرة ​​واحدة فقط. كيف يتم تنفيذ هذا من الناحية الفنية هو في وقت لاحق قليلا.


مصمم وعد ، فلسفته. يشبه تنفيذ وظيفة رد الاتصال "المنفذ" لوعد. مخطط التفاعل: وعد (المنشئ) - منفذ (رد الاتصال) - وعد (كائن)


لذلك ، اكتشفنا أن الوعد هو كيان كائن JS تقنيًا به حقول داخلية مخفية خاصة ، والتي بدورها توفر ملء فلسفي بمعنى كلمة "وعد".


عندما يقوم المبتدئ بإنشاء كائن الوعد لأول مرة ، تنتظره الصورة التالية (الشكل 5).


خطأ خلق كائن الوعد
الشكل 5. (في المرة الأولى التي نخلق فيها كائن الوعد بشكل حدسي)

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


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


منشئ الوعد يستخدم المنفذ
الشكل 6. (إنشاء كائن الوعد ، تمرير وظيفة المنفذ إلى مُنشئ الوعد)

من التسمية التوضيحية إلى الشكل ، نرى أن الوظيفة (معلمة مُنشئ الوعد) لها اسمها الخاص - المنفذ. وتتمثل مهمتها في البدء في الوفاء بالوعد ، ويفضل أن يصل به إلى نوع من الاستنتاج المنطقي. وإذا كان المبرمج يمكنه كتابة أي كود في المنفذ ، فكيف يمكن للمبرمج أن يشير إلى JS بأن كل شيء - العمل قد أنجز - هل يمكنك أن تذهب وترى نتائج الوعد؟


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


لفهم المعلومات الجديدة ، تتم دعوة الوافد الجديد إلى ترميز البيان التالي بشكل مستقل: "أعدك أن أقسم رقمًا واحدًا على آخر وأن أقدم إجابة ، إذا كان المقسوم فقط هو صفر." إليك الشكل الذي سيبدو عليه الرمز (الشكل 7).


مهمة الوعد: القسمة على الصفر
الشكل 7. (حل مشكلة تقسيم الرقمين إلى الوعود)

الآن يمكنك تحليل النتيجة. نرى أنه للمرة الثانية ، تعرض وحدة التحكم في المتصفح كائن Promis بطريقة مثيرة للاهتمام. وهي: يشار إلى حقلين إضافيين بين قوسين مربعين. يمكنك رسم تشابه بأمان بين [[PromiseState]] و [[PromiseStatus]] ، تم الوفاء به وحله ، [[PromiseValue]] و [[PromiseResult]]. نعم ، يحاول المستعرض نفسه إخبار المبرمج عن وجود وقيمة الحقول الداخلية لكائن الوعد. نرى أيضًا النظام المتصل لكائن الوعد ، ووظيفة المنفذ ، والرموز المميزة لوظيفة رد الاتصال ، و rej.


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


مهمة الوعد: القسمة على الصفر. نسخة بديلة
الشكل 8. (تباين الحل لمشكلة تقسيم الرقمين من خلال الوعود)

هل ستعمل الكود؟ أين هي وظيفة المنفذ هنا وما هو اسمها؟ هل اسم "wantToDivide" مناسب في هذا الرمز؟ ماذا تعود وظيفة الربط بعد نفسها؟ لماذا يتم تمرير الوسائط إلى دالة الربط فقط في المركزين الثاني والثالث؟ أين حل وظائف خاصة وظيفة ورفض وظيفة تختفي؟ كيف دخلت أرقام المدخلات اللازمة رقم 1 ورقم 2 في "خطة الوفاء بالوعد"؟ كم عدد العناصر الموجودة في الحجج الزائفة؟ هل من الممكن التعافي من الذاكرة كيف ستبدو الإجابة في وحدة تحكم المتصفح؟


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


عرض / نسخ الرمز
let number1 = Number(prompt("input number 1")); let number2 = Number(prompt("input number 2")); let wantToDivide = function() { if (arguments[1] === 0) { arguments[3]("it is forbidden to divide by zero"); return; } let result = arguments[0] / arguments[1]; arguments[2](result); }; let myPromise = new Promise(wantToDivide.bind(null, number1, number2)); console.log(myPromise); 


النظر في الوسيط المنفذ - أ: حل ورفض وظائف


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


بالنسبة للمبتدئين ، دعونا نحاول أن ننظر إليهم ببساطة في وحدة تحكم المطور (الشكل 9).


وظيفة البحث العزم
الشكل 9. (التحقيق في وظيفة حل وظيفة - الدقة)

نرى أن وظيفة العزم هي وظيفة تأخذ وسيطة واحدة (طول الخاصية === 1). والنموذج الأولي هو Function.prototype.


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


كونترول الخارجي للكائن الوعد
الشكل 10. (نترجم وعد myPromise إلى الحالة الموفاة خارج الوعد)

لا شيء خارج عن المألوف. يتم تمرير الوظائف كنوع فرعي لكائن في JavaScript بالرجوع إليها. كل شيء يعمل كما توقعنا. حصل المتغير من إغلاق outerRes على إشارة إلى وظيفة حل الدقة. واستخدمنا وظيفتها لوضع الوعد في حالة الوفاء خارج المنفذ نفسه. يوضح المثال التالي المعدل قليلاً الفكرة نفسها ، لذا انظر إلى الكود والتفكير في أي حالة وبأي قيمة ستكون myPromise1 و myPromise2 (الشكل 11). ثم يمكنك التحقق من الافتراضات الخاصة بك تحت المفسد.


وعد المهمة. سؤال الشكل 11. (مهمة الانعكاس. في أي حالة وبأي قيمة ستكون الوعود myPromise1 و myPromise2 في وحدة تحكم المطور؟)

الإجابة على المشكلة في الشكل 11 (الشكل 12).
وعد المهمة. إجابة
الشكل 12. (الجواب على المشكلة في الشكل 11)

والآن يمكنك التفكير في سؤال واحد مثير للاهتمام. لكن كيف تعرف وظيفة العزم / الرفض دائمًا بالضبط أي الوعد المطلوب ترجمته إلى الحالة المطلوبة؟ ننتقل إلى الخوارزمية في المواصفات ، التي تصف كيفية إنشاء هذه الوظائف (الشكل 13).


إنشاء وظائف حل
الشكل 13. (ميزات إنشاء وظائف حل لكائن وعد محدد واحد)

نقاط مهمة يجب الانتباه إليها:


  • في وقت إنشاء وظائف العزم / الرفض ، يتم ربطها بشكل صارم بالكائن الوعد الوحيد المقابل له
  • تحتوي دالات العزم / الرفض كنوع بيانات كائن على حقولها المخفية الخاصة بها [[وعد]] و [[سبق حلها]] ، والتي توفر للجميع منطقًا بديهيًا مألوفًا بأن أ) - حل الدالات نفسها يترجم كائن الوعد إلى الحالة اللازمة ؛ وحقيقة أن ب) لا يمكن نقل الوعد إلى دولة أخرى إذا تم استدعاء وظيفة العزم أو الرفض على الأقل. يمكن تمثيل هذه الخوارزمية بالشكل التالي (الشكل 14).

    حل وظائف وعد الكائن
    الشكل 14. (مجالات وظيفة مخفية من وظيفة حل ورفض وظيفة)

    لن يتم اعتبار الخوارزميات التي تستخدم هذه المعلومات من الحقول المخفية الآن ، لأنها مطوّلة وأكثر تعقيدًا. ما زلنا بحاجة للتحضير لهم من الناحية النظرية والمعنوية. في الوقت الحالي ، يمكنني فقط أن أؤكد تفكيرك: "واو ، كم هو بسيط. ربما ، في كل قرار / قرار الوعد بالكائن ، سيتم فحص علامة "الكائن" {[[القيمة]]: خطأ}. وإذا تم ضبطه على "صحيح" ، فإننا نوقف عملية ترجمة الوعد إلى دولة أخرى بعودة بسيطة. " نعم - هذا ما يحدث بالضبط. يبدو أنه يمكنك الإجابة بشكل صحيح على السؤال التالي دون مشاكل. ماذا ستكون النتيجة في وحدة تحكم المطور (الشكل 15)؟


    خبرة في ربط وظائف حل وجوه الوعد
    الشكل 15. (تجربة توضح العلاقة بين وظائف الرفض والرفض مع كائن وعد محدد واحد)

    خوارزمية لإنشاء كائن الوعد وفقًا لمواصفات ECMAScript


    تأمل لحظة السحر عندما ولدت في العالم - كائن وعد كامل (الشكل 16).


    وعد خلق في ecmascript
    الشكل 16. (خوارزمية لإنشاء كائن وعد من مواصفات EcmaScript)

    لا ينبغي أن تنشأ أسئلة معقدة عند عرضها:

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

    لا أعرف إذا كان هذا اكتشافًا لك ، يتم تنفيذ خوارزمية المسؤول عن التنفيذ هنا والآن ، في الوضع المتزامن العادي ، حتى قبل كتابة شيء للمتغير إلى يسار مُنشئ Promise. ولكن في الوقت المناسب بالنسبة لي أصبح الوحي.


    نظرًا لأننا تطرقنا إلى موضوع التزامن والتزامن ، فإليك الرمز التالي الذي يمكنك من خلاله "التفكير" أو التجريب. سؤال: بعد إلقاء نظرة على إنشاء مبرمج ديما ، هل يمكنك الإجابة عن معنى اللعبة المشفرة أدناه؟


     function randomInteger(min, max) { return Math.floor(min + Math.random() * (max + 1 - min)); } function game() { let guessCubeNumber = Number(prompt("Throw dice? Guess number?", 3)); console.log("throwing dice ... wait until it stop"); let gameState = new Promise(function(res, rej) { setTimeout(function() { let gottenNumberDice = randomInteger(1, 6); gottenNumberDice === guessCubeNumber ? res("you win!") : rej(`you loose. ${gottenNumberDice} points dropped on dice`); }, 3000); }); return gameState; } console.log(game()); 

    بالطبع ، هذا هو محاكاة لفافة الموت. يمكن للمستخدم تخمين الرقم الذي سقط أم لا؟ تعرف على كيفية دمج setTimeout غير المتزامن عضويا في المنفذ المتزامن - في خطتنا ، قم بالتموت واكتشف الرقم الذي سقط. كيف يمكن للمرء تفسير النتائج في وحدة تحكم المطور بطريقة خاصة (الشكل 17)؟


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


    لعبة الوعد - رمي النرد
    الشكل 17. (حالة الوعد لكائن عندما تكون هناك عملية غير متزامنة في وظيفة المنفذ)

    إذا كنت مهتمًا بهذا المثال ، أو إذا كنت تريد تخمين عدد المكعب المقلوب ، فيمكنك نسخ الكود وإجراء تجاربك. الشجاعة!


    رد فعل الوعد نتيجة الوعد الذي تم الوفاء به


    كما ترون في الشكل 14 ، يتم توقيع عواقب حل / حل وعد كائن ما على أنها "+ رد فعل" و "رد فعل". المصطلح الرسمي لهذه الكلمات من مواصفات ECMAScript هو رد فعل الوعد. يفترض أنه في المقالات التالية سيتم النظر في هذا الموضوع بالتفصيل. في الوقت الحالي ، نقصر أنفسنا على الفكرة العامة حول ماهية رد فعل الوعد ، بحيث يمكن ربط هذا المصطلح بشكل صحيح بالمعنى الفلسفي لهذه الكلمة وتنفيذه الفني.


    كما نتذكر ، فإن الوعد قد يكون له عواقب ، لكن قد لا يكون كذلك. ما هي النتيجة؟ هذا هو العمل الذي سيحدث في وقت لاحق: بعد الوفاء بالوعد. ونظرًا لأن هذا إجراء ، يمكن التعبير عن النتيجة بواسطة وظيفة JavaScript طبيعية. سيتم تنفيذ بعض الوظائف في حالة نجاح حل الوعد (+ رد فعل) ؛ وظائف أخرى - في حالة وصول الوعد إلى الحالة المرفوضة (رد الفعل). تقنيًا ، يتم تمرير هذه الدالات (النتائج) في الوسائط عندما يتم استدعاء الأسلوب Promise.prototype.then ().


    وبالتالي ، جزء مهم من رد الفعل الوعد هو عمل غير متزامن يتم تنفيذه في وقت ما في المستقبل. هناك عنصر مهم ثانٍ في رد الفعل الوعد - هذا هو الوعد الذي تم إنشاؤه حديثًا والذي تم إرجاعه بعد تنفيذ الأمر Promise.prototype.then (). ذلك لأن العواقب تؤثر على الوعود الأخرى. على سبيل المثال ، هناك وعد بشراء سيارة ، ولكن فقط بعد الوفاء بوعد لكسب مبلغ معين من المال. تم الوفاء بوعد واحد - النتيجة التي تحققت - الآن يمكن الوفاء بالوعد الثاني.


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


    وعد رد فعل في ذلك الحين () الطريقة
    الشكل 18. (يتم تسجيل عواقب حل الوعد من خلال وظائف رد الاتصال في طريقة then (). سيتم استدعاء رد الاتصال بشكل غير متزامن تلقائيًا بواسطة محرك JS)

    لتلخيص


    1) تعرفنا على الوعود في جافا سكريبت وفلسفتها والتنفيذ الفني. يتم تنفيذ كل هذا باستخدام حقول الوعد الداخلية الخاصة للكائن: [[PromiseState]] ، [[PromiseValue]] ، [[PromiseFulFillReactions]] ، [[PromiseRejectReactions]].


    2) يتم إعطاء الفرصة للمبرمج للوفاء بوعده من خلال وظيفة المنفذ ، وتم تمريره كحجة إلى مُنشئ الوعد.


    3) يتم تحديد حدود الوعد الذي تم الوفاء به أو غير المحقق من خلال وظائف علامة خاصة ، ووظيفة العزم ورفض وظيفة ، وغالبا في رمز يسمى res و rej. يتم إنشاء هذه الوظائف تلقائيًا بواسطة JavaScript ويتم تمريرها في الوسائط إلى المنفذ.


    4) حل الوظيفة ورفض وظيفة دائما كائن الوعد المرتبطة بها ، فضلا عن حقل خاص مشترك {[[القيمة]]: خطأ} ، والذي يضمن أن يتم حل الوعد مرة واحدة فقط.


    5) [[PromiseFulFillReactions]] و [[PromiseRejectReactions]] هي حقول داخلية لكائن الوعد تخزن عواقب حل الوعد ، جزء مهم منها عبارة عن وظائف غير متزامنة مخصصة معرفة من خلال طريقة الوعد Promise.prototype.then () للكائن.


    PS


    تم إعداد هذه المقالة باعتبارها ملخصًا لجلسة الفيديو الخاصة بمجموعة InSimpleWords. يوجد ما يكفي من "دروس الفيديو" ولا تزال هناك مواد لتدوين الملاحظات. سؤال آخر هو ما إذا كان من المثير للاهتمام أن يقرأ أعضاء المجتمع مقالة عن الوعود على التوالي. في انتظار تعليقاتكم.

Source: https://habr.com/ru/post/ar478938/


All Articles