فهم جافا سكريبت متزامن وغير متزامن - الجزء 1
متزامن و غير متزامن مفاهيم مربكة في JavaScript ، خاصة للمبتدئين. شيئين أو أكثر متزامن عندما هم يحدث في نفس الوقت (في المزامنة) ، و غير متزامن عندما لا يفعلون ذلك (غير متزامن).
على الرغم من أن هذه التعاريف يسهل قبولها ، إلا أنها في الواقع أكثر تعقيدًا مما تبدو عليه. نحن بحاجة إلى أن تأخذ في الاعتبار ما هي بالضبط في المزامنة, و ما ليس كذلك.
ربما كنت استدعاء أ عادي
وظيفة في جافا سكريبت متزامن ، أليس كذلك؟ وإذا كان شيء من هذا القبيل setTimeout ()
أو أجاكس التي تعمل معها ، ستشير إليها على أنها غير متزامنة ، نعم؟ ماذا لو قلت لك ذلك على حد سواء غير متزامن بطريقة ما?
لشرح لماذا ا, نحن بحاجة إلى اللجوء إلى السيد X للمساعدة.
السيناريو 1 - السيد X يحاول التزامن
إليك الإعداد:
- السيد X هو شخص يمكنه الإجابة على الأسئلة الصعبة والقيام بأي مهمة مطلوبة.
- الطريقة الوحيدة للاتصال به هي عبر مكالمة هاتفية.
- مهما كان السؤال أو المهمة التي حصلت عليها ، من أجل طلب مساعدة السيد إكس في تنفيذها ، استدعاء له.
- السيد X يعطيك الجواب أو يكمل المهمة على الفور, ويتيح لك معرفة تم التنفيذ.
- كنت وضعت المتلقي الشعور المحتوى والخروج لفيلم.
ما قمت به للتو كان أ متزامن (ذهابا وإيابا) الاتصالات مع السيد X. لقد استمع وأنت تسأل له سؤالك ، وكنت تستمع عندما كان يجيب عليه.
السيناريو 2 - السيد X غير راض عن التزامن
نظرًا لأن السيد X فعال للغاية ، يبدأ في تلقي العديد من المكالمات. فماذا يحدث عندما تتصل به ولكن انه مشغول بالفعل التحدث مع شخص آخر؟ لن تتمكن من طرح سؤالك - لا حتى يكون حراً في تلقي مكالمتك. كل ما ستسمعه هو نغمة مشغول.
إذن ما الذي يمكن للسيد إكس فعله لمكافحة هذا?
بدلاً من تلقي المكالمات مباشرة:
- السيد X يستأجر رجل جديد ، السيد M ويعطيه جهاز الرد على المكالمات للمتصلين لترك الرسائل.
- وظيفة السيد م نقل رسالة من جهاز الرد على المكالمات إلى السيد X بمجرد أن يعلم أن السيد X انتهى تمامًا من معالجة جميع الرسائل السابقة وهو بالفعل حر في اتخاذ واحدة جديدة.
- والآن عندما تتصل به ، بدلاً من الحصول على نغمة مشغول ، ستترك رسالة للسيد X ، إذن انتظر حتى يتصل بك (لا يوجد وقت فيلم حتى الآن).
- بمجرد الانتهاء من السيد X مع جميع الرسائل التي تم وضعها في قائمة الانتظار التي تلقاها قبل رسالتك ، سوف يبحث في مشكلتك ، و سأتصل بك لاحقا لتعطيك إجابة.
الآن هنا يكمن السؤال: هل كانت الإجراءات حتى الآن متزامن أو غير متزامن?
إنه مختلط. عندما تركت رسالتك, السيد X لم يكن يستمع إليه ، لذلك كان التواصل الرابع غير متزامن.
ولكن ، عندما أجاب, كنت هناك الاستماع, التي يجعل الاتصالات العودة متزامن.
آمل الآن أن تكون قد اكتسبت فهمًا أفضل لكيفية إدراك التزامن من حيث التواصل. الوقت لجلب جافا سكريبت.
جافا سكريبت - لغة برمجة غير متزامنة
عندما يقوم شخص ما بتصنيف JavaScript على أنه غير متزامن ، فإن ما يشير إليه بشكل عام هو كيف يمكنك ذلك اترك رسالة لذلك ، و لم يتم حظر مكالمتك مع لهجة مشغول.
وظيفة المكالمات هي أبدا مباشرة في جافا سكريبت, تم القيام به حرفيا عبر الرسائل.
جافا سكريبت يستخدم قائمة انتظار الرسائل حيث يتم الاحتفاظ الرسائل (أو الأحداث) الواردة. ل الحدث حلقة (مرسل رسالة) بشكل متتابع يرسل تلك الرسائل إلى استدعاء المكدس حيث وظائف المقابلة من الرسائل مكدسة كأطر (وظيفة الحجج والمتغيرات) للتنفيذ.
يحتفظ مكدس الاستدعاء بإطار الوظيفة الأولية التي يتم استدعاؤها وأي إطارات أخرى للوظائف التي يتم استدعاؤها عبر مكالمات متداخلة فوقها .
عندما تنضم رسالة إلى قائمة الانتظار ، تنتظر حتى تكدس المكالمة فارغة من جميع الإطارات من الرسالة السابقة, وعندما يكون ، حلقة الحدث dequeues الرسالة السابقة, ويضيف الأطر المقابلة للرسالة الحالية إلى مكدس الاستدعاءات.
تنتظر الرسالة مرة أخرى حتى تصبح مكدس الاستدعاءات فارغة من الأطر المقابلة الخاصة بها (على سبيل المثال ، عمليات إعدام جميع الوظائف المكدسة قد انتهت) ، ثم يتم إلغاء تثبيتها.
النظر في التعليمات البرمجية التالية:
function foo () function bar () foo ()؛ الدالة baz () bar ()؛ باز () ؛
وظيفة يجري تشغيل الباز ()
(في الصف الأخير من مقتطف الشفرة) ، والذي تتم إضافة رسالة إلى قائمة الانتظار, وعندما تلتقطها حلقة الأحداث ، تكدس المكالمة يبدأ تكديس الإطارات إلى عن على الباز ()
, شريط()
, و فو ()
في نقاط التنفيذ ذات الصلة.
بمجرد اكتمال تنفيذ الوظائف واحدة تلو الأخرى ، تصبح إطاراتها إزالتها من مكدس المكالمة, بينما الرسالة لا تزال تنتظر في قائمة الانتظار, حتى الباز ()
هو برزت من المكدس.
تذكر ، وظيفة المكالمات هي أبدا مباشرة في جافا سكريبت, لقد انتهوا عبر الرسائل. لذلك عندما تسمع شخصًا ما يقول أن جافا سكريبت نفسها هي لغة برمجة غير متزامنة ، افترض أنهم يتحدثون عن برنامجها المدمج “جهاز الرد الالي”, وكيف أنت حر في ترك الرسائل.
ولكن ماذا عن الطرق غير المتزامنة المحددة?
حتى الآن لم أتطرق إلى واجهات برمجة التطبيقات مثل setTimeout ()
وأجاكس ، تلك هي تلك التي هي يشار إليها على وجه التحديد باسم غير متزامن. لماذا هذا?
من المهم أن نفهم بالضبط ما هو متزامن أو غير متزامن. جافا سكريبت ، بمساعدة الأحداث وحلقة الأحداث ، قد تتدرب معالجة غير متزامنة للرسائل, لكن ذلك لا يعني كل شىء في جافا سكريبت غير متزامن.
تذكر ، لقد أخبرتك أن الرسالة لم تغادر حتى تكدس المكالمة فارغة من الأطر المقابلة لها, مثلما لم تترك للفيلم حتى تحصل على إجابتك - هذا يجري متزامن, انت هناك الانتظار حتى اكتمال المهمة, وتحصل على الجواب.
انتظار ليست مثالية في جميع السيناريوهات. ماذا لو بعد ترك رسالة ، بدلاً من الانتظار ، يمكنك ترك الفيلم؟ ماذا لو كانت وظيفة ما يمكن أن تتقاعد (إفراغ مكدس الاستدعاء) ، ويمكن إلغاء تأشير رسالتها حتى قبل اكتمال مهمة الوظيفة؟ ماذا لو كان يمكن أن يكون رمز تنفيذها بشكل غير متزامن?
هذا هو المكان واجهات برمجة التطبيقات مثل setTimeout ()
وتأتي AJAX إلى الصورة ، وما يفعلونه هو ... انتظر ، لا يمكنني تفسير ذلك دون الرجوع إلى السيد X ، والذي سنراه في الجزء الثاني من هذه المقالة. ترقب.