مقدمة
في صورتي ، ظهرت غير متزامن لأول مرة مع Ajax. كنت لا أزال أعمل على .NET في ذلك الوقت ، ثم أصدرت .NET بالفعل عنصر تحكم غير متزامن ...
على الرغم من أنني عرفت أخيرًا أنه لم يكن غير متزامن ... ثم ، يتم استخدام غير المتزامن في الواجهة الأمامية كثيرًا. إذا لم يكن برنامجًا غير متزامن ، فأنت محرج أن تقول إن Nodejs التي كتبتها قد صنعت من قبل الفرصة JavaScript.
كما تم إحضار ميزة نموذج البرمجة غير المتزامن. غير المتزامن له العديد من المزايا ، لكنه كابوس للتصميم. يمكن أن يعطل التوقيت غير المتزامن ، لذلك يزيد من صعوبات التصميم.
ومع ذلك ، فإن غير المتزامن قد أحدث ثورة في تحسين الأداء وتجربة المستخدم ، وبالتالي فإن الميزات غير المتزامنة من NodeJs واضحة للغاية. اليوم سوف نتعلمه ببساطة
غير متزامن I/O.
في الواقع ، على مستوى نظام التشغيل ، لا يوجد سوى طريقتين للإدخال/الإخراج ، محظورة وغير محظورة
في نموذج الانسداد ، يحتاج التطبيق إلى انتظار إكمال الإدخال/الإخراج قبل إرجاع النتيجة. خاصتها هي أن لاعب خط الوسط الخلفي مدعو لانتظار النظام لإكمال جميع العمليات. سيؤدي ذلك إلى انتظار وحدة المعالجة المركزية ، بدلاً من العودة مباشرة بعد مكالمة الانسداد.
كنت أقرأ كتابًا عندما كنت مبتدئًا ، لكنني شعرت أنه لم يتم وصفه بوضوح هنا. علاوة على ذلك ، فإن النموذج غير المتزامن كبير في الواقع ، مجرد تحسن في مستوى الشعور. اسمحوا لي أن أعطيك مثالا بسيطا
لدي الآن عرض تطبيق صفحة واحدة لتطبيقين من صفحة واحدة. عندما أبحث ، أحتاج إلى البحث من خلال قنوات مختلفة. يحتاج Shenzhen إلى استدعاء طرف ثالث ، ثم يحصل الطرف الثالث على بيانات من قنوات محددة.
بالطبع هو بطيء جدا في هذا الوقت. إذا قطعت مباشرة من A إلى B و B لتحميل البيانات ، فلن تكون هناك مشكلة ، لكن المشكلة الآن هي أنني بحاجة إلى تأثيرات الرسوم المتحركة عند التحول من A إلى B.
هذا يتطلب أن ينتهي عرض BVIEW أثناء عملية التبديل ، وعلى الأقل لن يتم شحنه إلى العملية للحصول على البيانات والبدء في تقديم. لذلك ، قد لا يكون غير متزامن سهل الاستخدام. حتى إذا تم طلب البيانات بشكل غير متزامن ، فيجب الحصول على البيانات قبل أن يتم تحميل الصفحة.
لا يزال هذا التحميل محظور ، لا توجد طريقة للقيام بذلك في الأعمال التجارية
لا توجد تقنية مثالية ، وتسبب الانسداد في انتظار وحدة المعالجة المركزية في انتظار أن تضيع ، وعلاج عدم الحظر ، قد تتطلب أيضًا استطلاعًا لتأكيد ما إذا كان الحمل قد اكتمل (اعتدت على استخدام الاقتراع لاكتشاف ما إذا كان قد تم إنشاء DOM)
تعتمد Nodejs آلية حلقة الحدث. عندما تبدأ العملية ، ستقوم العقدة بإنشاء حلقة ميتة. كل عملية تنفيذ هيئة الحلقة هي علامة. تتمثل عملية كل علامة في معرفة ما إذا كانت هناك أحداث يجب معالجتها.
إذا كان هناك ، قم بإزالة الحدث المتعلق ، وقم بتنفيذه ، ثم أدخل المنطق التالي. إذا لم يكن هناك ، اخرج من الحلقة
خلال كل عملية علامة ، هناك مراقب واحد أو أكثر في كل حلقة حدث. إن عملية الحكم على ما إذا كان هناك حدث يمكن معالجته هو سؤال هؤلاء المراقبين عما إذا كان الحدث بحاجة إلى معالجة.
خذ نموذج حدث HTML الخاص بنا كمثال
بالنسبة إلى HTML ، في الواقع ، كل من DOM هو مراقب. يلاحظ DOM في الصفحة تغييرات صفحة الويب الخاصة بنا. بعد أن نقدم AddEventListener إلى DOM ، سنقوم بتسجيل وظيفة رد الاتصال. سيتم وضع الأحداث التي نسجلها في كائن "حاوية". في هذا الوقت ، هو مجرد تسجيل. سيتم تشغيل هذه الوظائف بعد تلبية الشروط (عندما تتغير الصفحة) ، وسيتم إخراج الأحداث ذات الصلة من الحاوية للتنفيذ.
ننقر الآن على نقطة على الصفحة مرة واحدة ، وبعد ذلك سنأخذ مجموعة أحداث النقر من الحاوية. سنجد DOMs ذات الصلة ثم يؤدي إلى تشغيل وظائف رد الاتصال لهذه DOMs.
قد تأتي الأحداث من نقرات المستخدم أو تغييرات البيانات. في العقدة ، تأتي الأحداث بشكل أساسي من طلبات الشبكة وملف i/o. سيكون لهذه الأحداث مراقبين مقابلة ، مثل مراقبي الملفات ومراقبي الشبكة.
هذا أيضًا نموذج نموذجي للإنتاج/الاستهلاك ، وإدخال/إخراج غير متزامن ، وطلبات الشبكة لتوفير إنتاج الأحداث ، ويتم نقل الأحداث إلى مختلف المراقبين ، ومراقبون تسجيل الأحداث ، وحلقات الأحداث مسؤولة عن أخذ الأحداث ثم تنفيذ الأحداث
ملاحظة: خذ انقر كمثال. يقوم كل DOM Observer أولاً بتسجيل الحدث ، وتراقب عملية الصفحة باستمرار الصفحة ، والنقر فوق حدث إنتاج الصفحة ، ثم يتم إخراج حدث النقر المسجل من الحاوية وتنفيذه.
يتم التحكم في منطق الوظيفة العامة من قبلنا:
نسخة الكود كما يلي:
var foreach = function (قائمة ، رد الاتصال) {
لـ (var i = 0 ، len = list.length ؛ i <len ؛ i ++) {
رد الاتصال (قائمة [i] ، أنا ، قائمة) ؛
}
}
في حالة عدم التزامن ، لم تعد وظيفة رد الاتصال من قبل المطور. في كل مرة يتم فيها بدء مكالمة JS ، سيتم إنشاء كائن طلب المنتج الانتقالي.
نسخة الكود كما يلي:
fs.open = دالة (المسار ، الأعلام ، الوضع ، رد الاتصال) {
bingding.open (pathmodule._makelong (path) ، stringtoflags (flags) ، mode ، callback) ؛
} ؛
يفتح Fs.Open ملفًا بناءً على المسار والمعلمات للحصول على البيانات ذات الصلة. تسمى الواجهة المتعلقة بـ C ++ داخليًا ، وسيتم إنشاء كائن وسيط أثناء العملية ، وسيتم تضمين جميع حالاتنا ...
ملاحظة: لا أشعر بالرضا بعد مشاهدته لفترة طويلة
خاتمة
ما سبق هو كل شيء عن I/O غير متزامن في NodeJS. ملخص شخصي ، إذا كان هناك أي إغفال أو أخطاء ، فيرجى الإشارة إليها.