1. دور Node.js ،
معنى I/O ، (I/O هو اختصار الإدخال/الإخراج ، مثل: نص نوع لوحة المفاتيح ، والمدخلات ، والنص معروضة على الشاشة. تحركات الماوس ، ويتم نقل الماوس ، ويتم نقل الماوس على الشاشة ، والمدخلات الطرفية ، والإخراج. إلخ.)
المشكلة التي تريدها Node.js حلها ، (إدخال العملية ، التزامن العالي. على سبيل المثال ، قد يكون هناك ملايين اللاعبين في الألعاب عبر الإنترنت ، وملايين المدخلات ، إلخ.
معنى التزامن ، (يصف مصطلح التزامن أن الأمور ستحدث في نفس الوقت وقد تتفاعل مع بعضها البعض. يتيح لنا نموذج I/O الخاص بالعقدة تجنب المشكلات الشائعة المتمثلة في التزامن في الإدخال/الإخراج غير المتزامن متعدد مؤشرات الترابط المتعدد)
شبكة التوضيح I/O.
رمز JS
var http = require ('http') ، urls = ['www.baidu.com' ، 'www.10jqka.com.cn' ، 'www.duokan.com'] ؛ وظيفة fetchpage (url) {var start = new date () ؛ http.get ({host: url} ، function (res) {console.log ("GOT RESPLIST من:" + url) ؛ console.log ("request take:" ، date () - start ، "ms") ؛}) ؛ } لـ (var i = 0 ؛ i <urls.length ؛ i ++) {fetchPage (urls [i]) ؛ }اسمه node.js
نقوم بتشغيل Node Node.js في المحطة
الإخراج:
نطلب node.js الوصول إلى ثلاثة عناوين URL والإبلاغ عن الاستجابة المستلمة والوقت الذي استغرقته.
يمكننا أن نرى أن وقت الإخراج يختلف عن المرتين. متأثرًا بالعوامل المختلفة ، وقت حل طلبات DNS ، وبرامج الخادم المزدحمة ، إلخ.
لماذا تعتبر JavaScript لغة تعتمد على الحدث
يدور JavaScript حول بنية الحدث التي ارتبطت في الأصل بنموذج كائن المستند (DOM). يمكن للمطورين القيام بالأشياء عند حدوث الأحداث. تتضمن هذه الأحداث المستخدمين الذين ينقرون على عنصر ما ، وتكمل الصفحة تحميل ، وما إلى ذلك. باستخدام الأحداث ، يمكن للمطورين كتابة المستمعين للأحداث التي يتم تشغيلها عند حدوث الأحداث.
2. رد الاتصال
1. ما هو رد الاتصال
2. تحليل رد الاتصال
يشير رد الاتصال إلى تمرير وظيفة كوسيطة إلى وظيفة أخرى وعادة ما يتم استدعاؤها بعد اكتمال الوظيفة الأولى.
مثال: على سبيل المثال ، طريقة Hide () في jQuery ،
رمز JS
1 ، $ ("P"). إخفاء ("بطيء") ؛ 2 ، $ ("P"). Hide ('Slow' ، function () {Alert ("The Paragraph الآن مخفية")}) ؛عوامل الاسترجاعات اختيارية.
1 لا حاجة إلى رد اتصال
2. هناك رد اتصال. عندما يتم إخفاء الفقرة ، سيتم استدعاؤها ، والتي تظهر موجه التنبيه.
من أجل رؤية الفرق بين الكود مع وبدون عمليات الاسترجاعات
رمز JS
$ ("P"). إخفاء ("بطيء") ؛ التنبيه ("الفقرة الآن مخفية") ؛ // 1 $ ("P"). إخفاء ("بطيء" ، وظيفة () {تنبيه ("الفقرة مخفية الآن")}) ؛ // 21. لا يوجد رد اتصال ، وترتيب التنفيذ هو نفسه. ومع ذلك ، يمكننا أن نرى أن الفقرة P لم يتم إخفاءها تمامًا ، يخرج التنبيه.
2. هناك رد اتصال ، ويتم التنفيذ بعد اكتمال الاختباء.
تحليل عمليات الاسترجاعات
رمز JS
وظيفة hostbreakfast (الطعام ، الشراب ، رد الاتصال) {console.log ("وجود barakfast من ' + food +' ، ' + drink) ؛ if (callback && typeof (callback) === "function") {callback () ؛ }} hasbreakfast ('foast' ، 'coffee' ، function () {console.log ('HIST BROKDER. حان الوقت للذهاب إلى العمل!) ؛}) ؛الإخراج:
بعد الحصول على الإفطار من الرغوة ، وجبة الإفطار. حان الوقت للذهاب إلى العمل!
فيما يلي وظيفة تم إنشاؤها مع ثلاث معلمات ، المعلمة الثالثة هي رد الاتصال ، والتي يجب أن تكون وظيفة.
تسجل دالة hybbreakfast ما تأكله في وحدة التحكم ثم تستدعي وظيفة رد الاتصال التي تم نقلها إليها كمعلمة.
كيفية استخدام عمليات الاسترجاعات لـ Node.js
مثال على استخدام وحدة نظام الملفات لقراءة محتوى الملف من القرص في node.js
رمز JS
var fs = require ('fs') ؛ fs.readfile ('somefile.txt' ، 'utf8' ، function (err ، data) {if (err) err ؛ console.log (data) ؛}) ؛والنتيجة هي: المحتوى في SomeFile.txt.
1. وحدة FS (نظام الملفات) مطلوب للاستخدام في البرنامج النصي
2. يتم توفير مسار الملف على نظام الملفات كمعلمة الأولى لطريقة FS.ReadFile.
3. المعلمة الثانية هي UTF8 ، مما يشير إلى ترميز الملف
4. توفير وظيفة رد الاتصال كمعلمة ثالثة لطريقة FS.ReadFile
5. المعلمة الأولى لوظيفة رد الاتصال هي خطأ ، والذي يتم استخدامه لحفظ الخطأ الذي تم إرجاعه عند قراءة الملف.
6. المعلمة الثانية لوظيفة رد الاتصال هي الضغط عليها ، ويقوم المستخدم بحفظ البيانات التي يتم إرجاعها بواسطة ملف القراءة.
7. بمجرد قراءة الملف ، سيتم استدعاء رد الاتصال.
8. إذا كان ERR صحيحًا ، فسيتم طرح خطأ.
9. إذا كانت ERR خاطئة ، فيمكن استخدام البيانات من الملف.
10. في هذه الحالة ، سيتم تسجيل البيانات على وحدة التحكم.
أخرى هي وحدة HTTP ، تتيح وحدة HTTP للمطورين إنشاء عملاء وخوادم HTTP.
رمز JS
var http = require ('http') ؛ http.get ({host: 'ShapeShed.com'} ، function (res) {console.log ("got repress:" + res.StatusCode) ؛}). on ('error' ، function (e) {console.log ("got error:" + e.message) ؛}) ؛النتيجة: حصلت على الرد: 200
1. اطلب وحدة HTTP للاستخدام في البرنامج النصي
2. قدم معلمتين لطريقة http.get ()
3. المعلمة الأولى هي كائن الخيار. في هذا المثال ، تحتاج إلى الحصول على الصفحة الرئيسية لـ ShapeShed.com
4. المعلمة الثانية هي وظيفة رد الاتصال مع الاستجابة كمعلمة
5. عندما يقوم الخادم البعيد بإرجاع الوظيفة المقابلة ، سيتم تشغيل وظيفة رد الاتصال.
6. سجل رمز حالة الاستجابة في وظيفة رد الاتصال. إذا كان هناك أي خطأ ، فيمكنك تسجيله.
بعد ذلك ، لنرى أن 4 عمليات مختلفة للإدخال/الإخراج تحدث ، فهي تستخدم جميع عمليات الاسترجاعات
رمز JS
var fs = require ('fs') ، http = require ('http') ؛ http.get ({host: 'www.baidu.com'} ، function (res) {console.log ("baidu.com") ؛}). on ('error' ، function (e) {console.log ("got error: fs.ReadFile ('somefile.txt' ، 'utf8' ، function (err ، data) {if (err) err ؛ console.log ("somefile") ؛}) ؛ http.get ({host: 'www.duokan.com'} ، function (res) {console.log ("duokan.com") ؛}) fs.readfile ('somefile2.txt' ، 'utf8' ، function (err ، data) {if (err) err ؛ console.log ("somefile2") ؛}) ؛هل يمكننا معرفة أي عملية تعود أولاً؟
التخمين هو أنه يتم إرجاع الملفان الذي يقرأ من القرص أولاً ، لأنه لا توجد حاجة لدخول الشبكة ، لكن من الصعب علينا تحديد الملف الذي سيعود أولاً ، لأننا لا نعرف حجم الملف. لاكتساب صفحتين منزليتين ، يحتاج البرنامج النصي إلى إدخال الشبكة ، ويعتمد وقت الاستجابة على العديد من الأشياء التي لا يمكن التنبؤ بها. لن تخرج عملية Node.js حتى يكون هناك رد اتصال مسجل لم يتم تشغيله. تحل عروض الاسترجاعات أولاً عدم القدرة على التنبؤ ، وهي أيضًا طريقة فعالة للتعامل مع التزامن (أو القيام بأكثر من شيء في كل مرة).
فيما يلي نتائج تنفيذي
رمز متزامن وغير متزامن
انظر أولاً إلى الكود ، تزامن (أو حظر) الكود
رمز JS
وظيفة Sleep (milliseconds) {var start = new date (). getTime () ؛ بينما ((تاريخ جديد (). النوم (2000) ؛ console.log ("البيانات التي تم إرجاعها من صفحة الطلب") ؛ } الوظيفة fetchapi () {console.log ('fetching api') ؛ النوم (2000) ؛ console.log ('البيانات التي تم إرجاعها من API') ؛ } fetchpage () ؛ fetchapi () ؛عند تشغيل البرنامج النصي ، سيتم استدعاء وظيفة FetchPage (). حتى يعود ، يتم حظر تشغيل البرنامج النصي. قبل إرجاع وظيفة FetchPage () ، لا يمكن نقل البرنامج إلى وظيفة FetchAPI (). وهذا ما يسمى عملية الحظر.
Node.js تقريبًا لا تستخدم أبدًا نمط الترميز هذا ، ولكن يستدعي عمليات الاسترجاعات بشكل غير متزامن.
انظر إلى الكود التالي ،
رمز JS
var http = require ('http') ؛ Function FetchPage () {console.log ('fetching page') ؛ http.get ({host: 'www.baidu.com' ، path: '/؟ delay = 2000'} ، function (res) {console.log ('البيانات التي تم إرجاعها من صفحة الطلب ") ؛}). } الوظيفة fetchapi () {console.log ('fetching api') ؛ http.get ({host: 'www.baidu.com' ، path: '/؟ delay = 2000'} ، function (res) {console.log ('البيانات التي تم إرجاعها من طلب api') ؛}). } fetchpage () ؛ fetchapi () ؛عند السماح بهذا الرمز ، لم تعد تنتظر وظيفة FetchPage () للعودة ، وسيتم استدعاء وظيفة FetchAPI () على الفور. يتم حظر الكود باستخدام عمليات الاسترجاعات. بمجرد استدعاءها ، تستمع كلا الوظيفتين إلى عودة الخادم البعيد وتشغيل وظيفة رد الاتصال.
لاحظ أنه لا يمكن ضمان ترتيب إرجاع هذه الوظائف ، ولكنه مرتبط بالشبكة.
حلقة الحدث
تستخدم Node.js حلقة حدث JavaScript لدعم نمط البرمجة غير المتزامن الذي تدعوه. في الأساس ، تتيح حلقة الحدث للنظام حفظ وظيفة رد الاتصال أولاً ثم تشغيلها عند حدوث الحدث في المستقبل. يمكن أن يكون هذا بيانات إرجاع قاعدة بيانات أو بيانات إرجاع طلب HTTP. نظرًا لأن تنفيذ وظيفة رد الاتصال يتم تأجيله حتى يتم عكس الحدث ، فلا داعي لوقف التنفيذ ، ويمكن أن يعود تدفق التحكم إلى بيئة وقت تشغيل العقدة ، مما يسمح بحدوث أشياء أخرى.
غالبًا ما يُنظر إلى Node.js كإطار برمجة الشبكة لأنه مصمم للتعامل مع عدم اليقين في تدفقات البيانات في الشبكة. ما يساهم في مثل هذه التصميمات هو حلقات الأحداث واستخدام عمليات الاسترجاعات ، وهم مثل المبرمجين الذين يمكنهم كتابة التعليمات البرمجية غير المتزامنة التي تستجيب لأحداث الشبكة أو الإدخال/الإخراج.
القواعد التي يجب اتباعها هي: يجب أن تعود الوظيفة بسرعة ، ويجب عدم حظر الوظيفة ، ويجب نقل العمليات طويلة الأجل إلى عملية أخرى.
ما هو غير مناسب لـ Node.js يتضمن معالجة كميات كبيرة من البيانات أو تشغيل العمليات الحسابية لفترة طويلة. تم تصميم Node.js لدفع البيانات على الشبكة وإكمالها على الفور.