في التمرين السابق،
تعلمنا عن جانبين جديدين لجافا سكريبت،
ودعمهم لوظائف الدرجة الأولى والإغلاق.
رأينا أيضًا كيف تتعامل العقدة مع جانب البرمجة غير المتزامن وكيف
تدعم العقدة التنفيذ غير المتزامن للرمز
باستخدام عمليات الاسترجاعات وكذلك معالجة الأخطاء.
دعونا ننظر إلى مثال على كيفية الاستفادة من هذا
داخل تطبيق عقدة لدينا في هذا التمرين.
استمرار مع حيث توقفنا في التمرين السابق،
والآن أنا ذاهب للذهاب وتعديل وحدة عقدة المستطيل،
بحيث يمكن أن تأخذ مساعدة من الاستدعاءات.
لذلك سأقوم بإزالة هذه الصادرات هنا،
وبدلاً من ذلك، سيقومون بتعديل هذه الوظيفة.
أنا ذاهب إلى الاستفادة من هاتين الوظيفتين في وقت لاحق قليلا،
لذلك لهذا السبب أنا حفظ لهم في الجزء السفلي.
لذا دعني أبقيهم جانباً
ثم سأقوم بتعديل هذه الوحدة المستطيلة على النحو التالي.
لذلك سنقول module.exports.
لذلك نحن نستخدم الطريقة القياسية يتم التعامل مع الوحدة.
وهذا هو الذهاب إلى تصدير هذه الوظيفة التي تأخذ هذه المعلمات الثلاثة،
x و y و رد الاتصال.
رد الاتصال هو وظيفة التي سيتم توفيرها في عندما يتم استدعاء هذه الوحدة.
لذلك هذا هو استخدام وظائف الدرجة الأولى التي تحدثنا عنها في وقت سابق.
حتى داخل هذا الاستدعاء،
حتى تتمكن من رؤية أنك تحصل على معلمتين، x و y
في هذه الحالة، بالنسبة للمستطيل،
تتوافق x و y مع طول وعرض
المستطيل الذي يتم تمريره كقيمتين.
حتى داخل هنا، ونحن في طريقنا للتحقق لمعرفة
ما إذا كان س أقل من أو يساوي الصفر أو ص هو أقل من أو يساوي الصفر.
لقد كتبنا رمز مثل هذا هنا.
لذلك أنا فقط ذاهب لنسخ هذا الرمز من هنا
ومن ثم إحضاره إلى هنا وبعد ذلك سنقوم بتحريره.
لذلك في هذه الحالة، هذا إذا كان x
أقل من أو يساوي الصفر أو ص أقل من أو يساوي الصفر.
في هذه الحالة، ماذا نفعل؟
في هذه الحالة، نلاحظ
أن أبعاد المستطيل أقل من أو تساوي الصفر.
لذا علينا أن نتعامل مع الأمر بشكل مختلف،
وسنقوم بالجزء الآخر منه.
الجزء الآخر حيث نتعامل مع الوضع حيث المستطيل هو مستطيل صالح.
لذلك في هذه الحالة،
ما سنفعله هو استخدام setTimeout.
حتى هنا، أنا محاكاة حقيقة أن كل ما
يتم القيام به في هذا المستطيل سوف يستغرق بعض الوقت.
إذن هذه هي المعالجة غير المتزامنة.
الآن، بما أنه ليس لدي الكثير من العمل للقيام به في الخلفية،
لذلك سأقوم بمحاكاة ذلك ببساطة باستخدام
وظيفة setTimeout من JavaScript ثم
التأخير قبل استدعاء وظيفة رد الاتصال.
لذا فإن الطريقة التي أرتب بها هذا هي كما يلي.
حتى داخل setTimeout،
وأنا ذاهب لاستدعاء هذه الوظيفة هناك
وترتيب تأخير
2،000 ميلي ثانية أو ثانيتين وبعد ذلك سيتم استدعاء هذه الوظيفة.
لذلك إذا كنت تتذكر،
setTimeout المدعوم في JavaScript،
فإنه يأخذ
كمعلمة الأولى وظيفة والمعلمة الثانية ستكون الفترة الزمنية التي سيتأخر فيها ذلك.
لذلك اسمحوا لي أن المسافة البادئة هذا في.
الآن، أنا بحاجة لملء هذه الوظيفة هنا.
لذلك لقد بدأت مع وظيفة السهم هنا
التي لا تأخذ المعلمات وبعد ذلك عندما يتم استدعاء هناك،
وأنا ذاهب لإصدار مكالمة إلى رد الاتصال.
رد الاتصال هذا هو وظيفة رد الاتصال التي
سيتم تمريرها كمعلمة ثالثة هنا. تأخذ
وظيفة رد الاتصال هذه، كما لاحظت، معلمتين.
الأول هو الخطأ والثاني هو قيمة الإرجاع.
حتى في هذه الحالة، بما أن لدينا خطأ،
لأن x هو أقل من أو يساوي الصفر و y أقل من أو يساوي الصفر،
وبالتالي فإن القيمة الأولى أنا ذاهب لتمرير في كخطأ جديد،
وهذا الخطأ هو بالضبط هذه السلسلة التي كنت تستخدم في console.log
ثم، وهذا هو ما سوف تمر في الخطأ هنا.
اسمحوا لي الآن حذف أن console.log،
لم أعد بحاجة إليها.
لذلك بالنسبة
إلى رد الاتصال، سأقوم بإنشاء كائن خطأ جديد ثم قم
بتمرير هذا كقيمة إرجاع لوظيفة رد الاتصال، المعلمة الأولى.
لذلك سأقول أن أبعاد المستطيل يجب أن تكون أكبر من الصفر.
لذلك سنقول l،
هذا هو x والقيمة y التي حصلنا عليها كقيم الإدخال هناك.
لذلك هذا هو رد الاتصال.
والجزء الثاني من هذا الاتصال،
وأنا ذاهب لتمرير في كما فارغة لأن هذا هو الذهاب إلى إرجاع خطأ.
لذلك عندما تقوم بإرجاع خطأ كمعلمة أولى،
سيتم تجاهل المعلمة الثانية عندما تم استلام رد الاتصال هذا للتو من قبل
وحدة العقدة من حيث نسمي هذه الوظيفة المعينة هناك.
لذلك، مع هذا الترتيب،
أقل من الصفر،
لذلك اسمحوا لي أن أعطي بعض المساحة هنا بحيث يتم وضع مسافة بادئة بشكل صحيح هنا.
لذا، فإن الطريقة التي أرتب بها هذا
هنا هي أنه إذا كان x أقل من الصفر و y أقل من الصفر،
فسأقوم باستدعاء وظيفة رد الاتصال التي تم تمريرها،
ولكن المعلمة الأولى ستمر في
الخطأ لأننا هنا نلاحظ أن هناك خطأ،
والمعلمة الثانية سيكون فارغًا.
إذا لم يكن هذا هو الحال،
ثم أنا ذاهب لاستدعاء نفس رد الاتصال،
ولكن مع المعلمة الأولى.
لذلك اسمحوا لي أن نسخ هذا الرمز في هنا.
ما زلت سأستخدم setTimeout هنا.
ولكن هذا الجزء الأول لن يكون خطأ،
بدلا من ذلك، الجزء الأول،
في هذه الحالة، لا يوجد خطأ.
لذلك أنا ذاهب فقط لتمرير هذه القيمة باعتبارها فارغة.
لذلك هذا يعني أنه تم تعيين الخطأ إلى null.
لذلك هذا هو مستطيل صالح.
حتى نتمكن من حساب القيم للمستطيل.
ولكن بدلاً من ذلك، سأقوم ببساطة بتمرير
كائن JavaScript يحتوي على الوظيفتين
كقيمتين داخل كائن JavaScript هذا.
لذلك، هنا أنا ذاهب إلى اتخاذ هذه اثنين،
محيط والمنطقة،
وبعد ذلك سيتم تمرير هذه اثنين في كما القيمتين هنا،
محيط والمنطقة.
وهذان الاثنان، نظرًا لأنهما يحدثان أن يكونا كائن جافا سكريبت،
لذلك سيكون المحيط والمنطقة
هما الخاصتان اللتان سأنقلهما داخل كائن JavaScript،
وهذا كل شيء.
حتى هنا، في الحالة الثانية،
يتم تعيين الخطأ إلى فارغة لأنه لا يوجد خطأ،
ولكن الجزء الثاني،
لاحظ أنني تمرير في كائن جافا سكريبت يحتوي على اثنين من الخصائص،
محيط والمنطقة، وهما وظيفتان هنا.
لذا فإن الوظيفتين هما وظيفة المحيط ووظيفة المنطقة.
لذلك سيتم تمرير كائن جافا سكريبت هذا مرة أخرى
كقيمة الإرجاع لاستدعاء هنا، القيمة الثانية.
ومرة أخرى، سأقوم بتأخير هذا
بفاصل زمني ثانٍ قبل أن يتم تمرير القيمة مرة أخرى بواسطة هذه الوظيفة.
السبب في أنني أستخدم setTimeout
هو محاكاة تأخير قبل أن يأتي رد الاتصال من الجانب الآخر.
لذلك يمثل هذا النوع من الحالات حيث، على سبيل المثال،
تقوم بإصدار استدعاء قاعدة بيانات لقاعدة البيانات،
ويجب قراءة قاعدة البيانات قبل أن يتم تمرير القيمة مرة أخرى إليك.
لذلك هذا سوف يستغرق قدرا معينا من الوقت.
لذلك أنا أساسا محاكاة هذا في هذه اللحظة باستخدام وظيفة setTimeout هنا.
في وقت لاحق، سترى أنه عندما ندمج MongoDB مع
Express لدينا في التدريبات اللاحقة،
يجب محاكاة هذا التأخير،
وسوف يكون سببه تلقائيا بسبب حقيقة أنك تحتاج إلى القيام
بعمليات قاعدة البيانات وراء الكواليس قبل الحصول على البيانات.
حتى هنا، بعد الانتهاء من تحديث وحدات المستطيل هذا،
لذلك ترى هنا أن وحدة المستطيل تأخذ في
ثلاثة معلمات كما انها مكالمة إدخال هنا،
س، ص و رد الاتصال.
وهكذا، فإن رد الاتصال هو وظيفة رد الاتصال التي يتم توفيرها هنا.
وسيتم استدعاء وظيفة رد الاتصال هذه داخل هنا،
وعندما يتم استدعاء وظيفة رد الاتصال،
إما
أن تقوم بتمرير خطأ مرة أخرى أو تقوم بتمرير وظيفة تسمح لك بحساب محيط ومنطقة المستطيل.
الآن، هذا النمط من الاتصال في وتمرير وظيفة رد اتصال
من وحدة عقدة واحدة ثم وحدة العقدة الثانية التي عندما تكتمل،
سوف تمر مرة أخرى النتيجة باستخدام وظيفة رد الاتصال هو
بالضبط النمط الذي سترى غالبا ما تتكرر في تطبيقات عقدة.
لذلك هذا هو السبب في أنني أوضح ذلك.
بالطبع، هذا مثال مفتعل أقوم بتوضيحه هنا ولكنه يظهر
جميع الأنماط القياسية التي ستستخدمها مع
وظائف العقدة ورد الاتصال وكذلك معالجة الأخطاء.
الآن، قمنا بتحديث وحدة المستطيل هنا.
دعونا نذهب وإصلاح هذا الملف index.js بحيث يمكن أن تمر في وظيفة رد الاتصال
ثم التعامل مع قيمة الإرجاع التي يتم إرسالها مرة أخرى من وحدة المستطيل.
التبديل مرة أخرى إلى index.js،
والآن نحن ذاهبون لتحديث ملف index.js على النحو التالي.
أنا ذاهب لإزالة هذا من ملف index.js بدلا من ذلك.
هنا، ما سنفعله في نهاية المطاف هو استدعاء
وحدة المستطيل هذه ومن
ثم تمرير في l و b كمعلمتين.
والمعلمة الثالثة التي سأقوم بتمريرها هي وظيفة رد الاتصال هذه.
وبالتالي فإن وظيفة رد الاتصال لديها معلمتين، خطأ ومستطيل.
ويتم تنفيذ وظيفة رد الاتصال هذه على النحو التالي هنا.
حتى هنا، ترى أن أنا استدعاء
هذه وحدة العقدة المستطيلة وأنا
تمرير في طول واتساع المعلمات الأولين.
والمعلمة الثالثة هي، بالطبع،
وظيفة رد الاتصال التي أقوم بتنفيذها هنا.
لذا، هذه هي وظيفة السهم التي أقوم بتنفيذها هنا.
حتى داخل وظيفة رد الاتصال هذه،
كيف يمكنني التعامل مع قيمة الإرجاع؟
حتى هنا سوف أقول إذا (err)،
لذلك إذا تم إرجاع قيمة الخطأ لك،
ثم سأقوم ببساطة console.log وسأقول
«خطأ» ثم القيمة الثانية هي err.message.
أذكر أنه في المستطيل،
أنشأنا كائن الخطأ الجديد هذا
ثم مررنا في هذه السلسلة داخل كائن الخطأ هذا.
سيتم إرفاق هذه السلسلة
إلى كائن الخطأ إلى خاصية الرسالة لكائن الخطأ هنا.
لذلك، في ملف index.js،
لذلك أنا استرداد خاصية الرسالة من كائن الخطأ
ثم طباعتها على وحدة التحكم الخاصة بي هنا.
لذلك في حالة حدوث خطأ،
سأقوم بطباعة رسالة الخطأ باستخدام هذا.
وهكذا، هذه هي الطريقة التي يمكنني التعامل مع الخطأ الذي تم إرجاعه بواسطة وظيفة رد اتصال.
خلاف ذلك، بالطبع في هذه الحالة،
أعادت وحدة المستطيل وظيفة المستطيل،
الكائن الذي يحتوي على محيط وظائف المنطقة،
حتى أتمكن من المضي قدما وطباعة تلك القيمة.
حتى هنا, سأقول مساحة المستطيل
من أبعاد ل يساوي,
لذلك سأقول,
و ب يساوي.
السبب الذي يجعلني أعرفه
بشكل صريح سيصبح واضحًا جدًا عند تشغيل هذا المثال.
سأقول هو المستطيل. المنطقة.
الآن، لاحظ أنه بالنسبة لهذه المنطقة،
أنا لا أرسل أي معلمات هنا لأنه يذهب إلى القيم،
وقد تم تمرير الطول والتنفس بالفعل هنا في l و b،
وتلك ستكون متاحة بالفعل لهذا
وهنا بسبب الإغلاق الذي يدعم جافا سكريبت.
لأن هذه x و y قد جاءتا كمعلمات،
بحيث يمكن الوصول إليها هناك في وظيفة رد الاتصال هذه.
لذلك سوف تكون هذه x_y متاحة تلقائيا بالنسبة لنا هنا.
لذا، في الواقع،
لست بحاجة إلى توفير هذه المعلمات x و y هنا على الإطلاق لأن
تلك x و y سيتم استردادها من هذا x و y هناك.
لذلك لا أحتاج حتى إلى تمرير هاتين القيمتين هنا.
لهذا السبب، هناك حق،
يمكنني استدعاء المستطيل.
وسيحصل حساب المنطقة هذا تلقائيًا على l و b التي تم تمريرها
بواسطة استدعاء المستطيل إلى وحدة العقدة المباشرة في وقت سابق.
لذلك هذا هو إغلاق جافا سكريبت العاملة هنا.
لذا، هذا هو أول واحد.
أنا طباعة مساحة المستطيل.
نفس الشيء، اسمحوا لي أيضا طباعة محيط.
لذلك لطباعة محيط،
لذلك سأقول console.log.
محيط المستطيل سيكون محيط مستطيل.
الآن، يجب أن أقول لكم أن هذا النوع من النهج للتنفيذ يأخذ القليل
من الجهد لفهم واستيعاب القدرة الوظيفية غير المتزامنة.
يستغرق بعض الوقت بالنسبة لك لفهم تماما كيف يعمل حقا.
الآن لتوضيح حقيقة أن
استدعاء الدالة هذه سيؤدي إلى استدعاء وحدة العقدة
ولكن سيتم تنفيذ هذا الجزء فقط بعد
تأخير ثانيتين بسبب حقيقة أننا نستخدم علامة الوقت المحددة.
الآن، كما درسنا في عملية غير متزامنة،
لأننا انتقلنا من المعالجة إلى الخلف،
دعوني أيضًا أعرض console.log آخر هنا لتوضيح نقطة.
لذلك سنقول أن هذا البيان هو
بعد الدعوة إلى rect.
السبب في أنني أوضح هذه النقطة هو أنه عند إصدار هذه المكالمة،
لن يتم تنفيذ هذا الرمز حتى بعد تأخير ثانيتين.
لذلك، في هذه الأثناء،
سوف تستمر وظيفتك، الوظيفة الرئيسية هنا، ثم تنفيذ السطر التالي من التعليمات البرمجية التي تراها هنا.
إذن هذا هو الاستمرارية التي سترونها هنا.
لذلك، مع هذه التغييرات،
دعونا حفظ التغييرات ثم ننظر في كيفية تنفيذ هذا التطبيق الآن.
لذلك حفظ التغييرات.
دعونا نذهب إلى المحطة وتنفيذ هذا التطبيق العقدة.
الآن، والذهاب إلى المحطة، إضافة المطالبة.
اسمحوا لي أن اكتب npm start وستلاحظ على الفور
أن الحل وهذا البيان تم طباعته في وقت سابق.
ثم بعد هذا التأخير المحدد،
تم طباعة المنطقة والمحيط بها.
لذلك هذا هو تأخير لمدة ثانيتين التي قدمناها باستخدام الوقت المحدد.
لذلك، لاحظت أنه في الإصدار السابق،
تم طباعة هذا وعلى الفور تم طباعة المنطقة والمحيط أسفل ذلك مباشرة.
ولكن الآن، لاحظ أن هذه القيم تتم طباعتها بعد ذلك بقليل.
حتى بين، استدعاء وظيفتها مع المعلمات المختلفة التي ذهبت بالفعل
في ومن ثم يتم استدعاء الاستدعاءات مرة أخرى بعد اثنين من التأخير الثاني لكل واحد منهم.
وبسبب حقيقة أن هناك الإغلاق الذي تدعمه جافا سكريبت،
لذلك يتم الحفاظ على القيم التي يتم تمريرها.
وهكذا عندما يتم استدعاء وظيفة رد الاتصال،
تتم طباعة القيمة المناسبة.
لذلك هذا هو السبب في أن ترى أن المنطقة
ومحيط تتم طباعتها بشكل صحيح وهؤلاء الاثنين
هنا, هذه التصريحات اثنين هنا,
تتوافق
مع هذه الدعوة معينة إلى مباشرة مع l يساوي اثنين وب يساوي أربعة.
ثم هذان الإثنان،
بجانب اثنين، بطبيعة الحال،
تتوافق مع هذا معين والباقي منها كما ترون هنا.
لذا، ما أردت توضيحه هو حقيقة أنه عند إجراء حساب غير متزامن،
يأخذ الحساب غير المتزامن وقته الخاص
لإرجاع القيمة بينما
سيمضي الحساب الرئيسي إلى الأمام دون انتظار اكتمال الاستدعاء.
لذلك، عندما تحتاج إلى القيام بقدر معين من العمل،
قمت بتمريرها كرد اتصال إلى تلك الوحدة الأخرى.
وعندما تكمل هذه الوحدة الأخرى عملها،
فستتم معاودة الاتصال ثم سيتم تنفيذ هذا الرمز.
إذن هذه هي النقطة التي أظهرتها باستخدام هذا المثال.
مرة أخرى، كما قلت،
وهذا يأخذ قليلا من الخيال والتفاهم
بالنسبة لك لاستيعاب الطريقة التي يعمل بها هذا،
ولكن سترى أنه مع عقدة وأيضا إكسبريس وعندما نستخدم مونغودب،
سترى هذا النوع من النمط تكرار في كثير من الأحيان في الطريقة التي نكتب بها رمزنا.
لذلك مع هذا التوضيح البسيط من الاستدعاءات ومعالجة الأخطاء،
نكمل هذا التمرين.
هذا هو الوقت المناسب بالنسبة لك للقيام بتعليق الحصول على هذه الرسالة،
والعقدة، وعمليات الاسترجاعات، ومعالجة الأخطاء.