75- آموزش جاوااسکریپت | آشنایی با Iterators و Generators در (ES6)
در این آموزش با مفهوم تکرارکنندهها (Iterators) و مولدها (Generators) در جاوااسکریپت آشنا میشویم و یاد میگیریم چطور از آنها برای پیمایش گامبهگام دادهها یا تولید مقادیر نامحدود (مانند شناسه) استفاده کنیم.
در این آموزش به بررسی دو مفهوم کاربردی که در استاندارد ES6 به جاوااسکریپت اضافه شدند، یعنی Iterators (تکرارکنندهها) و Generators (مولدها) میپردازیم. این دو ابزار با وجود تفاوتهای ساختاری، کاربرد مشابهی دارند و به ما اجازه میدهند فرآیند پیمایش دادهها را کنترل، متوقف و در زمان دلخواه دوباره از همان نقطه از سر بگیریم.
- تکرارکنندهها (Iterators): مانند حلقههای پیشرفتهای هستند که قابلیت توقف (Pause) دارند.
- مولدها (Generators): توابعی هستند که میتوانند روند اجرای خود را متوقف کرده و چندین مقدار مختلف را در طول زمان بازگردانند.
پیادهسازی یک Iterator اختصاصی
یک Iterator شیئی است که متد next() را پیادهسازی میکند. این متد هر بار یک شیء شامل دو ویژگی زیر را برمیگرداند:
value: مقدار فعلی در پیمایش.done: یک مقدار Boolean که نشان میدهد آیا پیمایش به پایان رسیده است یا خیر.
در کد زیر یک تابع تکرارکننده برای آرایهای از نامها میسازیم:
// تعریف تابع تکرارکننده
function nameIterator(names) {
let nextIndex = 0;
return {
next: function() {
return nextIndex < names.length ?
{ value: names[nextIndex++], done: false } :
{ done: true };
}
};
}
// آرایه نمونه
const namesArray = ['Jack', 'Jill', 'John'];
// مقداردهی اولیه تکرارکننده
const names = nameIterator(namesArray);
// پیمایش گامبهگام
console.log(names.next()); // { value: "Jack", done: false }
console.log(names.next().value); // Jill
console.log(names.next().value); // John
console.log(names.next()); // { done: true }
پیادهسازی Generator
مولدها یا Generators توابعی هستند که با یک علامت ستاره (*) در کنار کلمه کلیدی function مشخص میشوند. این توابع به جای return معمولی، از کلمه کلیدی yield برای بازگرداندن مقادیر استفاده میکنند. هر بار فراخوانی متد next()، اجرای تابع را تا رسیدن به yield بعدی پیش میبرد.
مثال زیر معادل همان تکرارکننده بالا اما با استفاده از Generator است:
// تعریف یک تابع Generator
function* nameGenerator() {
yield 'Jack';
yield 'Jill';
yield 'John';
}
// مقداردهی اولیه Generator
const name = nameGenerator();
// دریافت مقادیر
console.log(name.next()); // { value: "Jack", done: false }
console.log(name.next().value); // Jill
console.log(name.next().value); // John
console.log(name.next()); // { value: undefined, done: true }
ساخت مولد شناسه بینهایت (Infinite ID Creator)
یکی از کاربردهای جذاب Generatorها، ساخت حلقههای بینهایت کنترلشده بدون مسدود کردن (Block کردن) مرورگر است. به عنوان مثال، میتوانیم سیستمی بسازیم که در هر بار درخواست، یک شناسه (ID) جدید و منحصربهفرد تولید کند:
// تعریف Generator برای تولید شناسه
function* createIDs() {
let index = 1;
while (true) {
yield index++;
}
}
// مقداردهی اولیه
const gen = createIDs();
// تولید شناسه به تعداد دلخواه
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
console.log(gen.next().value); // 3
console.log(gen.next().value); // 4
تا زمانی که متد next() را صدا نزنیم، بدنه حلقه while اجرا نمیشود و این کار مانع از کرش کردن برنامه میگردد.
جمعبندی
در این بخش آموختیم:
- چگونه یک Iterator دستی برای پیمایش کنترلشده بسازیم.
- چگونه از Generatorها و کلمه کلیدی
yieldبرای سادهسازی فرآیند تولید دادهها بهره ببریم. - چطور یک مولد شناسه نامحدود بدون آسیب به کارایی برنامه ایجاد کنیم.
در بخشهای بعدی، از این مفاهیم برای ساخت یک پروژه کاربردی در مرورگر (مانند پیمایشگر پروفایل کاربری) استفاده خواهیم کرد.