الصفحة الرئيسية » الترميز » فهم متزامن وغير متزامن في جافا سكريبت - الجزء 2

    فهم متزامن وغير متزامن في جافا سكريبت - الجزء 2

    في الجزء الأول من هذا المنشور ، رأينا كيف مفاهيم متزامن وغير متزامن ينظر إليها في جافا سكريبت. في هذا الجزء الثاني ، يظهر السيد X مرة أخرى لمساعدتنا على الفهم كيف setTimeout و اجاكس واجهات برمجة التطبيقات عمل.

    طلب غريب

    دعنا نرجع إلى قصة السيد X والفيلم الذي تريد أن تتركه. قل أنك تترك مهمة للسيد X قبل النزهة ، وأخبره أنه لا يمكن أن يبدأ العمل في هذه المهمة إلا خمس ساعات بعد حصل على رسالتك.

    إنه لا يشعر بالسعادة حيال ذلك ، وتذكر أنه لا يتلقى رسالة جديدة حتى يتم مع الرسالة الحالية ، وإذا أخذ رسالتك ، يجب أن تنتظر خمسة ساعات لبدء حتى في هذه المهمة. لذلك ، حتى لا يكون مضيعة للوقت ، وقال انه يجلب المساعد, السيد ح.

    بدلا من الانتظار ، يسأل السيد H ل ترك رسالة جديدة للمهمة في قائمة الانتظار بعد مرور ساعات معينة ، وينتقل إلى الرسالة التالية.

    خمس ساعات الماضية السيد ح تحديث قائمة الانتظار مع رسالة جديدة. بعد الانتهاء من معالجة جميع الرسائل المستحقة قبل السيد حاء ، السيد X ينفذ مهمتك المطلوبة. لذلك ، بهذه الطريقة ، يمكنك ترك طلب ليكون امتثلت في وقت لاحق, وليس الانتظار حتى يتم الوفاء به.

    ولكن لماذا يترك السيد H رسالة في قائمة الانتظار بدلاً من الاتصال بالسيد X مباشرة؟ لأنه كما ذكرت في الجزء الأول ، فإن فقط طريقة للاتصال السيد X هو من خلال ترك رسالة له عبر مكالمة هاتفية - لا استثناءات.

    1. و setTimeout () طريقة

    افترض أن لديك مجموعة من التعليمات البرمجية التي تريدها تنفيذ بعد وقت معين. من أجل القيام بذلك ، أنت فقط لفه في وظيفة, و إضافته إلى setTimeout () طريقة جنبا إلى جنب مع تأخير الوقت. بناء جملة setTimeout () على النحو التالي:

     setTimeout (الوظيفة ، تأخير الوقت ، arg ...) 

    ال الأرجنتين ... المعلمة تعني أي وسيطة تأخذها الوظيفة و وقت التأخير هو أن تضاف في مللي ثانية. يمكنك أن ترى أدناه مثالًا بسيطًا للرمز ، وهو المخرجات “مهلا” في وحدة التحكم بعد 3 ثوان.

     setTimeout (function () console.log ('hey')، 3000)؛ 

    ذات مرة setTimeout () يبدأ الركض, بدلا من حظر مكدس الدعوة حتى وقت التأخير المشار إليه قد انتهى ، يتم تشغيل الموقت, وتفرغ مكدس النداء تدريجياً للرسالة التالية (على غرار المراسلات بين السيد X والسيد H).

    عندما تنتهي الموقت ، رسالة جديدة ينضم إلى قائمة الانتظار, وحلقة الحدث تلتقطها عندما تكون مكالمة المكالمة مجانية بعد معالجة جميع الرسائل قبلها - وبالتالي يعمل الرمز بشكل غير متزامن.

    2. اجاكس

    أجاكس (JavaScript غير متزامن و XML) هو مفهوم يستخدم مدعوم (XHR) API to تقديم طلبات الخادم و التعامل مع الردود.

    عندما تجعل المتصفحات طلبات الخادم دون استخدام XMLHttpRequest ، فإن تحديث الصفحة و يعيد تحميل واجهة المستخدم الخاصة به. عندما تتم معالجة الطلبات والردود بواسطة XHR API ، و يبقى UI تتأثر.

    لذلك ، في الأساس الهدف هو تقديم طلبات دون إعادة تحميل الصفحة. الآن ، أين هو “غير متزامن” في هذا؟ إن استخدام رمز XHR (الذي سنراه في لحظة) لا يعني أنه AJAX ، لأن XHR API يمكن العمل بطرق متزامن وغير متزامن.

    XHR بشكل افتراضي تم تعيين ل العمل بشكل غير متزامن. عندما تقدم وظيفة طلب باستخدام XHR ، فإنه يعود دون انتظار الرد.

    إذا تم تكوين XHR ل كن متزامن, ثم تنتظر الوظيفة حتى تلقي استجابة ومعالجتها قبل العودة.

    مثال على الكود 1

    يعرض هذا المثال مدعوم خلق كائن. ال افتح() الأسلوب ، بالتحقق من صحة عنوان URL للطلب ، و إرسال() طريقة يرسل الطلب.

     var xhr = new XMLHttpRequest ()؛ xhr.open ("GET" ، url) ؛ xhr.send ()؛ 

    أي وصول مباشر إلى بيانات الاستجابة بعد إرسال() سوف تذهب سدى ، لأنه إرسال() لا تنتظر حتى اكتمال الطلب. تذكر ، تم تعيين XMLHTTPRequest للعمل بشكل غير متزامن بشكل افتراضي.

    مثال على الكود 2

    ال hello.txt الملف في هذا المثال هو ملف نصي بسيط يحتوي على النص "مرحبًا". ال استجابة خاصية XHR غير صالحة ، لأنها لم تُخرج النص "مرحبًا".

     var xhr = new XMLHttpRequest ()؛ xhr.open ("GET"، "hello.txt")؛ xhr.send ()؛ دوكمنت (xhr.response)؛ // سلسلة فارغة 

    XHR تنفذ الروتين الجزئي ذلك يبقى التحقق من وجود استجابة في كل ميلي ثانية ، و مشغلات الأحداث المجانية بالنسبة للدول المختلفة ، يمر الطلب. عندما يتم تحميل الاستجابة, يتم تشغيل حدث تحميل بواسطة XHR, والتي يمكن أن تقدم استجابة صالحة.

     var xhr = new XMLHttpRequest ()؛ xhr.open ("GET"، "hello.txt")؛ xhr.send ()؛ يكتب xhr.onload = function () document.write (this.response) // "hello" إلى المستند 

    الاستجابة داخل الحدث الحمل مخرجات 'مرحبا', النص الصحيح.

    يُفضل اتباع الطريقة غير المتزامنة ، حيث إنها لا تمنع البرامج النصية الأخرى حتى يتم إكمال الطلب.

    إذا كان لا بد من معالجة الاستجابة بشكل متزامن ، فإننا نمر خاطئة كالحجة الأخيرة لل افتح, التي أعلام XHR API قولها يجب أن يكون متزامن (افتراضيا الحجة الأخيرة لل افتح هو صحيح, التي لا تحتاج تحديدها صراحة).

     var xhr = new XMLHttpRequest ()؛ xhr.open ("GET"، "hello.txt"، false)؛ xhr.send ()؛ دوكمنت (xhr.response)؛ // يكتب "مرحبا" لتوثيق 

    لماذا تعلم كل هذا?

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

    إذا كنت تعرف كيف يناسب اللغز ، يمكنك ذلك تجنب هذا الارتباك. أنت تعرف أن تأخير الوقت في setTimeout () لا يشير إلى الوقت عندما يبدأ تنفيذ التعليمات البرمجية, لكن الوقت عندما تنتهي الموقت وانتظار رسالة جديدة ، والتي لن تتم معالجتها إلا عندما تكون مكدس الاستدعاءات مجانية للقيام بذلك.