تم قبول البرمجة غير المتزامنة في JavaScript تدريجياً. في السابق ، عادةً ما يقوم الأشخاص بتطبيقه من خلال تعشش رد الاتصال ، SetTimeOut ، SetInterval ، إلخ. يبدو الرمز غير بديهي للغاية ، ومن الصعب فهمه بسرعة دون النظر إلى منطق الكود بأكمله. تشمل الوظائف غير المتزامنة في JavaScript وظائف الإدخال/الإخراج (Ajax ، postmessage ، تحميل IMG ، تحميل البرنامج النصي ، إلخ) ، وظائف التوقيت (setTimeout ، setInterval) ، إلخ.
كلنا على دراية بهذه. في التطبيقات المعقدة ، غالبًا ما تكون هناك طبقات متعددة من التعشيش ، وحتى التفكير في أن بعض الخطوات لم تكتمل وتحدث استثناءات البرنامج. أبسط مثال هو: على سبيل المثال ، إذا قمت بحقن عقدة في DOM ، فيجب عليك الانتظار حتى يتم حقن العقدة وتشغيل العقدة. عندما يتم حقن عدد كبير من العقد ، يكون من الصعب في كثير من الأحيان فهم الوقت. إذا كان لدينا الرمز للاعتماد على بيانات واجهات برمجة تطبيقات الطرف الثالث. لا يمكننا أن نتعلم مدى استجابة الكمون API ، وقد يتم حظر أجزاء أخرى من التطبيق حتى تُرجع النتيجة. يوفر الوعود حلاً أفضل لهذه المشكلة ، فهو غير محظور ويتم فصله تمامًا عن الكود.
لذلك ، اسمحوا لي أن ألقي نظرة على البرمجة غير المتزامنة في JavaScript. بادئ ذي بدء ، أوصيك بإلقاء نظرة على الوعود الشائعة نسبيًا/المواصفات.
وعود/مواصفات
ملاحظة: لسهولة الفهم ، قد يختلف الوصف عن الوعود/المواصفات ؛
وعود CommonJS/مواصفات تبسيط البرمجة غير المتزامنة من خلال توحيد واجهات API ، مما يجعل الفهم هو رمز المنطق غير المتزامن لدينا.
نسمي تنفيذ الوعود/المواصفات. يحتوي كائن الوعد على ثلاث ولايات فقط: لم تتحقق ، والوفاء ، وفشل ؛ تم إنشاؤه في البداية مع حالة لم يتم الوفاء بها ، ويمكن للدولة أن تتغير فقط من غير محققة إلى الوفاء ، أو لم تتحقق من الفشل (فشل/رفض). بمجرد الوفاء بالدولة (مكتملة) أو فشل (فشل/رفض) ، لا يمكن للدولة أن تتغير بعد الآن.
توفر المواصفات/المواصفات حلاً لوصف مفهوم التأخير (أو المستقبل) في البرنامج. الفكرة الرئيسية هي عدم تنفيذ طريقة ما ثم منع التطبيق وانتظر النتيجة للعودة قبل استدعاء الأساليب الأخرى ، ولكن لإعادة كائن الوعد لتلبية الاستماع في المستقبل. يمكن الاستماع إلى كل من الدولة التي تم الوفاء بها والدولة الفاشلة. يسجل الوعد عمليات الاسترجاعات من خلال تطبيق واجهة آنذاك لإرجاع كائن الوعد:
نسخة الكود كما يلي: ثم (الوفاء ، errorhandler ، ProgressHandler) ؛
ثم يتم استخدام الواجهة للاستماع لحالات مختلفة من الوعد. يتم استخدام المستقاة للاستماع إلى الحالة التي تم الوفاء بها ، ويتم استخدام ErrorHandler للاستماع للحالة الفاشلة ، ويتم استخدام ProgressHandler للاستماع إلى الحالة غير المليئة. لا يجبر Promise الاستماع إلى الحدث غير المحققة (على سبيل المثال ، نحن نعلم أن الإصدار القديم من JQuery (1.5 ، 1.6) مؤجل هو تطبيق الوعد ، ولكنه لا ينفذ الدولة التي لم تتحقق.
يُعتقد عمومًا أن الواجهة التي كانت تُرجع كائن وعد جديد ، وليس كائن الوعد الأصلي. يمكن فهم كائن الوعد الجديد هذا باعتباره وجهة نظر لكائن الوعد الأصلي. أنه يحتوي فقط على مجموعة من أساليب كائن الوعد الأصلي. يمكن لهذه الأساليب فقط مراقبة حالة كائن الوعد الأصلي ، ولكن لا يمكن تغيير الحالة الداخلية للكائن المؤجل. هذا يمكن أن يتجنب النزاعات بين العديد من المتصلين ، والتي يمكن أن تغير حالة كائن الوعد الجديد دون التأثير على المتصلين الآخرين.
بالإضافة إلى ذلك ، يوفر Promise واجهتين تنفذ تحولات الدولة من حل (حالة التنفيذ من غير مكتملة إلى مكتمل) ورفض (حالة التنفيذ من غير المكتملة إلى رفض أو فشل).
أرسل صورة للمساعدة في فهم:
مع الوعد ، يمكنك كتابة المنطق غير المتزامن مع عقلية متزامنة. في الوظائف غير المتزامنة ، لا يمكنك استخدام Try/Catch للقبض على استثناءات ، ولا يمكنك إلقاء استثناءات. مع الوعد ، يمكننا مباشرة تحديد errorhandler ، وهو ما يعادل استثناءات التقاط.
فيما يلي العديد من مكتبات الفصل التي تتبع الوعود/المواصفات ، عندما ، Q ، RSVP.JS ، jQuery.deferred ، إلخ.