توفيق اسحيمة نشر 11 يونيو 2022 أرسل تقرير نشر 11 يونيو 2022 ارجو من احد الاخوة ان يعطيني مثالا واقعيا حيا حول اين نحتاج الى استخدام generators بالجافاسكريبت داخل مشاريعنا. 1 اقتباس
0 Adnane Kadri نشر 11 يونيو 2022 أرسل تقرير نشر 11 يونيو 2022 الغرض الأول من المولدات هو في كونها طريقة فعالة للتحكم في تنفيذ وتعليق شيفرة برمجية داخلها. بجانب انها لا تستهلك ذاكرة. لنقل اننا نحتاج أن نعالج منطقا معينا على أربع مستويات: function myFunc() { console.log('lvl 1 starts here') // lvl 1 code ============================ console.log('lvl 2 starts here') // lvl 2 code ============================ console.log('lvl 3 starts here') // lvl 3 code ============================ console.log('lvl 4 starts here') // lvl 4 code ============================ } استدعاء الوظيفة myFunc سيقوم بتنفيذ كامل منطق المستويات الأربع دفعة واحدة. الآن لو أردنا ان يمتلك كل مستوى خرجا معينا يمكن التعامل معه على نطاق خاص به، فإنه من الصعب تحقيقه عن طريق المنطق العادي لاحظ: function myFunc() { // تعليمات المستوى الأول ============================ return 'result after proccessed at level 1'; // =========== سيتم تجاهل كل التالي // تعليمات المستوى الثاني ============================ return 'result after proccessed at level 2'; // تعليمات المستوى الثالث ============================ return 'result after proccessed at level 3'; // تعليمات المستوى الرابع ============================ return 'result after proccessed at level 4'; } لأننا لن نصل من الأساس الى اي من المستويات الأخرى لأن return ستقوم بإيقاف تنفيذ التعليمات البرمجية عند اول مستوى وفقط. الحل هنا، هو في استعمال المولدات Generators، فبعد ان نعالج المعطيات على المستوى الاول يمكننا الاستفادة من عائد (نسميه نتيجة المولد Generator result) يميزه. وبدون الحاجة الى اعادة استدعاء فإنه سيمكنناعن طريق طلب المستوى التالي متى احتجنا المرور الى المستوى الثاني وهكذا. لاحظ المثال: function * myFunc() { // تعليمات المستوى الأول ============================ yield 'result after proccessed at level 1'; // =========== لن يتم تجاهل كل التالي // تعليمات المستوى الثاني ============================ yield 'result after proccessed at level 2'; // تعليمات المستوى الثالث ============================ yield 'result after proccessed at level 3'; // تعليمات المستوى الرابع ============================ yield 'result after proccessed at level 4'; } لاحظ أنه يتم تمييز دوال المولدات في جافاسكربت عن طريق النجمة وعائد المولد عن طريق الكلمة yield. لاحظ التطبيق العملي لها: var myGen = myFunc(); console.log(myGen.next().value) console.log(myGen.next().value) console.log(myGen.next().value) console.log(myGen.next().value) النتيجة: "result after proccessed at level 1" "result after proccessed at level 2" "result after proccessed at level 3" "result after proccessed at level 4" فالمولد هنا يحتفظ بالمستوى الذي هو عليه كل مرة نطلب فيها مستوى جديدا. الشيء الآخر المميز في المولدات هو في كونها كائنات قابلة للتكرار iterable فعلى سبيل المثال يمكنك عن طريقها انشاء تكرار لا متناهي دون ان يتوقف مفسر الشيفرة البرمجية عن العمل: function * infLoop() { let i = 0; while(true) yield i; } var inf = infLoop(); console.log(inf.next().value) console.log(inf.next().value) الآن لو احتجت استدعاء infLoop مليون مرة فستحافظ كل مرة على نطاقها الخاص الذي تستدعى ضمنه مرة واحدة. 1 اقتباس
السؤال
توفيق اسحيمة
ارجو من احد الاخوة ان يعطيني مثالا واقعيا حيا حول اين نحتاج الى استخدام generators بالجافاسكريبت داخل مشاريعنا.
1 جواب على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.