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