اذهب إلى المحتوى
  • 0

متى نستخدم generators في الجافاسكريبت

توفيق اسحيمة

السؤال

Recommended Posts

  • 0

الغرض الأول من المولدات هو في كونها طريقة فعالة للتحكم في تنفيذ وتعليق شيفرة برمجية داخلها. بجانب انها لا تستهلك ذاكرة. 

لنقل اننا نحتاج أن نعالج منطقا معينا على أربع مستويات: 

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 مليون مرة فستحافظ كل مرة على نطاقها الخاص الذي تستدعى ضمنه مرة واحدة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...