مع ازدياد شعبية البناء غير المتزامن / المنتظر ، يزداد الاهتمام بآلياته الداخلية. بعد البحث على الإنترنت ، من السهل معرفة أن المزامنة / الانتظار يعتمد على وعود ومولدات معروفة ، والتي هي أقل شهرة وشعبية.

المواد ، التي ننشر ترجمتها اليوم ، مخصصة للمولدات. وبالتحديد ، سنتحدث هنا عن كيفية عملها ، وكيف يتم استخدامها مع الوعود في أحشاء البناء غير المنتظر / المنتظر. يقول مؤلف هذا المقال أن المولدات ، من أجل تطبيقها العملي ، ليست ضرورية لإتقانها. بالإضافة إلى ذلك ، يشير إلى أنه يتوقع أن يكون القارئ ضليعاً في الوعود.
المكرر والمولدات
في JavaScript ، بدءًا من إصدار معيار ES6 ، ظهرت العديد من الميزات الجديدة التي تهدف إلى تبسيط العمل مع مجموعات البيانات غير المتزامنة والمجموعات. تقع
التكرارات والمولدات في هذه الفئة.
إحدى السمات البارزة للمكررات هي أنها توفر وسيلة للوصول إلى عناصر المجموعة واحدة تلو الأخرى ، مع السماح لك بتتبع معرف العنصر الحالي.
function makeIterator(array) { var nextIndex = 0; console.log("nextIndex =>", nextIndex); return { next: function() { return nextIndex < array.length ? { value: array[nextIndex++], done: false } : { done: true }; } }; } var it = makeIterator(["simple", "iterator"]); console.log(it.next()); // {value: 'simple, done: false} console.log(it.next()); // {value: 'iterator, done: false} console.log(it.next()); // {done: true}
سبق يمكننا peredaom وظيفة
makeIterator()
مجموعة صغيرة، تتألف من زوج من العناصر، ومن ثم يتم تمريرها من خلال ذلك باستخدام مكرر بواسطة استدعاء الأسلوب
it.next()
. انتبه للتعليقات التي توضح النتائج التي تم الحصول عليها باستخدام المكرر.
الآن دعونا نتحدث عن المولدات. المولدات هي وظائف تعمل مثل مصانع التكرار. فكر في مثال بسيط ، ثم تحدث عن آليتين تتعلقان بالمولدات.
function* sample() { yield "simple"; yield "generator"; } var it = sample(); console.log(it.next()); // {value: 'simple, done: false} console.log(it.next()); // {value: 'generator, done: false} console.log(it.next()); // {value: undefined, done: true}
لاحظ العلامة النجمية في إعلان الوظيفة. هذا يشير إلى أن هذه الوظيفة هي مولد. ألقِ نظرة أيضًا على الكلمة الرئيسية ذات
yield
. يوقف تنفيذ الوظيفة ويعيد قيمة معينة. في الواقع ، هاتان الميزتان هما الآليتان اللتان تحدثنا عنهما أعلاه:
- وظيفة المولد هي وظيفة معلن عنها باستخدام علامة النجمة بجوار الكلمة الأساسية
function
أو بجوار اسم الوظيفة. - يتم إنشاء مولد المولد عندما يتم استدعاء وظيفة المولد.
بشكل عام ، يوضح المثال أعلاه تشغيل وظيفة المصنع التي تولد التكرارات.
الآن بعد أن اكتشفنا الأساسيات ، لنتحدث عن أشياء أكثر إثارة للاهتمام. يمكن للمتكررين والمولدات تبادل البيانات في اتجاهين. على وجه التحديد ، يمكن للمولدات ، باستخدام الكلمة الرئيسية
iterator.next('someValue')
، إرجاع القيم إلى المكررات ، ولكن يمكن للمكررين أيضًا إرسال البيانات إلى المولدات باستخدام طريقة
iterator.next('someValue')
. إليك كيف تبدو.
function* favBeer() { const reply = yield "What is your favorite type of beer?"; console.log(reply); if (reply !== "ipa") return "No soup for you!"; return "OK, soup."; } { const it = favBeer(); const q = it.next().value; // console.log(q); const a = it.next("lager").value; // console.log(a); } // What is your favorite beer? // lager // No soup for you! { const it = favBeer(); const q = it.next().value; // console.log(q); const a = it.next("ipa").value; // console.log(a); } // What is your favorite been? // ipa // OK, soup.
المولدات والوعود
الآن يمكننا أن نتحدث عن كيف تشكل المولدات والوعود أساس البناء غير المنتظر / المنتظر. تخيل أنه بدلاً من إرجاع بعض القيم باستخدام الكلمة الأساسية الخاصة
yield
، فإن المولد يُرجع الوعود. في هذه الحالة ، يمكن لف المولد في وظيفة تنتظر الوعد بحل وإعادة قيمة الوعد إلى المولد في طريقة
.next()
، كما هو موضح في المثال السابق. هناك مكتبة شعبية ، تقوم بتنفيذ مثل هذه الإجراءات. يبدو هذا:
co(function* doStuff(){ var result - yield someAsyncMethod(); var another = yield anotherAsyncFunction(); });
الملخص
وفقًا لمؤلف هذه المادة ، يحتاج مطورو JS إلى معرفة كيفية عمل المولدات ، فقط من أجل فهم ميزات الهيكل الداخلي للتصميم غير المتزامن / المنتظر. لكن استخدامها مباشرة في التعليمات البرمجية الخاصة بك لا يستحق ذلك. تقدم المولدات في JavaScript القدرة على إيقاف الوظيفة مؤقتًا والعودة إليها عندما يرى المطور (وإذا كان ذلك ضروريًا). حتى الآن ، أثناء العمل مع وظائف JS ، توقعنا أن يتم تنفيذها ، عند استدعائها ، ببساطة من البداية إلى النهاية. تعد القدرة على إيقافها مؤقتًا أمرًا جديدًا بالفعل ، ولكن يتم تنفيذ هذه الوظيفة بشكل ملائم في البنية المتزامنة / التي تنتظر.
بالطبع ، يمكن للمرء أن يجادل في هذا الرأي. على سبيل المثال ، إحدى الحجج لصالح المولدات هي أن معرفة كيفية عملها مفيد لتصحيح الأخطاء مع التعليمات البرمجية في حالة عدم المزامنة / الانتظار ، حيث يتم إخفاء المولدات داخل هذا البناء. ومع ذلك ، يعتقد مؤلف المادة أن هذا ، مع ذلك ، شيء آخر غير استخدام المولدات في الكود الأصلي.
أعزائي القراء! ما رأيك في المولدات؟ ربما كنت تعرف بعض الخيارات لاستخدامها التي تبرر تطبيقها المباشر في رمز مشاريع JS؟
الرمز الترويجي الملكي للحصول على خصم 10٪ على خوادمنا الافتراضية:
