(generators) در زبانهای برنامهنویسی و جاوااسکریپت (JavaScript) ابزارهای مهمی هستند که به برنامهنویسان امکان تولید دادهها به صورت یکپارچه و زمانبندیشده را میدهند. این امکان برای مدیریت و پردازش اطلاعات طولانی، تولید نتایج درخواستهای کاربران در زمانبندی بهینه، و دسترسی به دادهها به صورت متناوب بسیار مفید است.
در جاوااسکریپت، یک ژنراتور یک تابع خاص است که با استفاده از کلمه کلیدی `function*` اعلام میشود. زمانی که یک ژنراتور فراخوانی میشود، یک شیء ژنراتور ایجاد میشود که میتواند دادهها را به صورت نیمهاجرایی تولید کند. در ادامه توضیحات کوتاهی در مورد دو جنراتور معمولی و جنراتورهای مسیردهی خواهیم داد.
**1. ژنراتور معمولی:**
ژنراتورها تابعی معمولی هستند که از کلمه کلیدی `yield` برای تولید نتایج استفاده میکنند. هنگامی که کلمه `yield` در تابع اجرا میشود، اجرای تابع متوقف میشود و مقدار بازگشتی در لحظه اجرا به عنوان نتیجه بازمیگردانده میشود. همچنین، حالت اجرای تابع نگهداشته میشود تا بار دیگری از آن فراخوانی شود و از همان نقطه که اجرای متوقف شده بود ادامه یابد.
نمونه کد ژنراتور معمولی در جاوااسکریپت:
function* generateNumbers() { yield 1; yield 2; yield 3; } const generator = generateNumbers(); console.log(generator.next().value); // 1 console.log(generator.next().value); // 2 console.log(generator.next().value); // 3
**2. ژنراتورهای مسیردهی (Iterators):**
ژنراتورهای مسیردهی (iterators) یک نوع ویژه از ژنراتورها هستند که از کلمه کلیدی `yield*` برای اتصال به ژنراتورهای دیگر استفاده میکنند. با `yield*` میتوانیم به صورت بهینه دادههای تولید شده توسط ژنراتورها را مدیریت کنیم.
نمونه کد ژنراتور مسیردهی در جاوااسکریپت:
function* generateNumbers() { yield 1; yield 2; } function* generateLetters() { yield 'A'; yield 'B'; }
function* generateCombined() { yield* generateNumbers(); yield* generateLetters(); } const generator = generateCombined(); console.log(generator.next().value); // 1 console.log(generator.next().value); // 2 console.log(generator.next().value); // 'A' console.log(generator.next().value); // 'B'
با استفاده از ژنراتورها و ژنراتورهای مسیردهی در جاوااسکریپت، میتوانیم کدها را خواناتر و بهینهتر نوشته و عملیاتهای پیچیده را با تعداد کمتری کد انجام دهیم.