ØªÙØ§Ø¨Ø¹ ٠ع٠ÙÙÛ ÙÙØ· ÛÚ©âØ¨Ø§Ø± Ù ÛâØªÙØ§ÙÙØ¯ ÛÚ© Ù ÙØ¯Ø§Ø±(Ù Ø«ÙØ§ ÛÚ© object ÛØ§ undefined) را برگرداÙÙØ¯.
ا٠ا generatorÙØ§ Ù ÛâØªÙØ§ÙÙØ¯ ÚÙØ¯ÛÙ Ø¨Ø§Ø±Ø Ø¨Ø± اساس ØªÙØ§Ø¶Ø§Ø Ù ÙØ§Ø¯Ûر Ù ØªÙØ§Ùت را برگرداÙÙØ¯(Ø§ØµØ·ÙØ§ØØ§ yield Ú©ÙÙØ¯.). generatorÙØ§ با ØÙÙÙâÙ¾Ø°ÛØ±Ùا (iterable) Ø¨Ù Ø®ÙØ¨Û کار Ù ÛâÚ©ÙÙØ¯ ٠ب٠ک٠ک Ø¢ÙâÙØ§ Ù ÛâØªÙØ§Ù Ø¬Ø±ÛØ§ÙâÙØ§Û داد٠ساخت.
ØªÙØ§Ø¨Ø¹ Generator
Ø¨Ø±Ø§Û Ø³Ø§Ø®ØªÙ ÛÚ© generator ب٠ÛÚ© سÛÙØªÚ©Ø³ خاص ÙÛØ§Ø² است: *functionØ Ú©Ù Ø¨Ù Ø¢Ù âØªØ§Ø¨Ø¹ generatorâ Ù ÛâÚ¯ÙÛÙØ¯.
Ø¸Ø§ÙØ± ÛÚ© تابع generator Ø¨Ù ØµÙØ±Øª Ø²ÛØ± است:
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
ØªÙØ§Ø¨Ø¹ generator با ØªÙØ§Ø¨Ø¹ ٠ع٠ÙÙÛØ Ø±ÙØªØ§Ø± Ù ØªÙØ§ÙØªÛ Ø¯Ø§Ø±ÙØ¯. ز٠اÙÛ Ú©Ù Ø§ÛÙ ØªÙØ§Ø¨Ø¹ صدا Ù ÛâØ´ÙÙØ¯Ø بدÙ٠آÙâÙØ§ اجرا ÙÙ ÛâØ´ÙØ¯Ø در Ø¹ÙØ¶Ø ÛÚ© Ø´ÛØ¡ خاص Ø¨Ù ÙØ§Ù âgenerator objectâ Ø¨Ø±Ù ÛâگرداÙÙØ¯ Ú©Ù Ø¨Ù ÙØ³ÛÙÙ Ø¢Ù Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ را Ù ÛâØªÙØ§Ù Ú©ÙØªØ±Ù کرد.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
//برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ generator ÛÚ© Ø´ÛØ¡ generator تابع
let generator = generateSequence();
alert(generator); // [object Generator]
Ø§Ø¬Ø±Ø§Û Ø¨Ø¯Ù٠تابع ÙÙÙØ² Ø´Ø±ÙØ¹ ÙØ´Ø¯Ù است:
Ù
تد اصÙÛ ÛÚ© Ø´ÛØ¡ generator Ù
تد ()next است. ÙÙگاÙ
Û Ú©Ù ØµØ¯Ø§ Ù
ÛâØ´ÙØ¯Ø بدÙ٠تابع تا اÙÙÛÙ yield value اجرا Ù
ÛâØ´ÙØ¯(value Ù
ÛâØªÙØ§Ùد ØØ°Ù Ø´ÙØ¯ ک٠در اÛÙ ØµÙØ±Øª undefined است.)Ø Ø³Ù¾Ø³ Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ Ù
تÙÙÙ Ù
ÛâØ´ÙØ¯ Ù Ù
ÙØ¯Ø§Ø± yield شد٠برگرداÙÙØ¯Ù Ù
ÛâØ´ÙØ¯.
Ù
ÙØ¯Ø§Ø± Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´Ø¯Ù ØªÙØ³Ø· Ù
ØªÙØ¯ next ÙÙ
ÙØ§Ø±Ù ÛÚ© Ø´ÛØ¡ با 2 Ù¾Ø±Ø§Ù¾Ø±ØªÛ Ø§Ø³Øª:
value: Ù ÙØ¯Ø§Ø± برگرداÙÙØ¯Ù Ø´Ø¯Ù ØªÙØ³Ø·yield.done: ÛÚ© Boolean است ک٠در ØµÙØ±Øª ات٠ا٠بدÙ٠تابع Ù ÙØ¯Ø§Ø± true ٠در ØºÛØ± اÛÙ ØµÙØ±Øª Ù ÙØ¯Ø§Ø± false دارد.
Ø¨Ø±Ø§Û Ù
Ø«Ø§ÙØ در کد Ø²ÛØ±Ø ÛÚ© Ø´ÛØ¡ generator Ø§ÛØ¬Ø§Ø¯ شد٠٠اÙÙÛÙ Ù
ÙØ¯Ø§Ø± yield Ø´Ø¯Ù ØªÙØ³Ø· Ø¢Ù Ú¯Ø±ÙØªÙ شد٠است:
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
let one = generator.next();
alert(JSON.stringify(one)); // {value: 1, done: false}
اکÙÙÙ ÙÙØ· Ù ÙØ¯Ø§Ø± اÙ٠را Ú¯Ø±ÙØªÙâØ§ÛÙ Ù Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ در خط دÙ٠٠تÙÙ٠شد٠است:
اکÙÙ٠اگر Ø¯ÙØ¨Ø§Ø±Ù ()generator.next را صدا بزÙÛÙ
Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ Ø´Ø±ÙØ¹ Ù
ÛâØ´ÙØ¯ ٠تا yield Ø¨Ø¹Ø¯Û Ù Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù شد٠Ù
ÙØ¯Ø§Ø± اداÙ
Ù Ù
ÛâÛØ§Ø¨Ø¯:
let two = generator.next();
alert(JSON.stringify(two)); // {value: 2, done: false}
٠اگر Ø¨Ø±Ø§Û Ø¨Ø§Ø± سÙÙ
آ٠را صدا بزÙÛÙ
Ø Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ ب٠return Ù
ÛâØ±Ø³Ø¯ ٠تÙ
اÙ
Ù
ÛâØ´ÙØ¯:
let three = generator.next();
alert(JSON.stringify(three)); // {value: 3, done: true}
اکÙÙ٠از رÙÛ done:true Ù
ØªÙØ¬Ù Ù
ÛâØ´ÙÛÙ
کار generator تÙ
اÙ
شد٠٠value:3 آخرÛÙ Ù
ÙØ¯Ø§Ø± Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´Ø¯Ù ØªÙØ³Ø· generator است.
دÛگر صدا کرد٠()generator.next Ù
ÙØ·ÙÛ ÙÛØ³Øª. اگر اÛ٠کار را Ø§ÙØ¬Ø§Ù
دÙÛÙ
Ø Ø´ÛØ¡ ÛکساÙÛ Ø¨Ø§ done:true Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ù
ÛâØ´ÙØ¯.
function* f(â¦)ÛØ§function *f(â¦)ØÙر د٠سÛÙØªÚ©Ø³ صØÛØ ÙØ³ØªÙد.
ÙÙÛ Ù
عÙ
ÙÙØ§ اÙÙÛ ØªØ±Ø¬ÛØ داد٠Ù
ÛâØ´ÙØ¯Ø ÚÙÙ * ÙÙØ¹ تابع Ù ÙÙ ÙØ§Ù
تابع را Ù
شخص Ù
ÛâÚ©ÙØ¯.
generatorÙØ§ ØÙÙÙâÙ¾Ø°ÛØ± ÙØ³ØªÙد.
ÙÙ
اÙâØ·ÙØ± Ú©Ù Ø§ØØªÙ
Ø§ÙØ§ با ØªÙØ¬Ù ب٠()next Ù
ØªÙØ¬Ù شدÙâØ§ÛØ¯Ø generatorÙØ§ ØÙÙÙâÙ¾Ø°ÛØ± ÙØ³ØªÙد.
با Ø§Ø³ØªÙØ§Ø¯ از for..of Ù
ÛâØªÙØ§Ù از value Ø¢ÙâÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù کرد:
function* generateSequence() {
yield 1;
yield 2;
return 3;
}
let generator = generateSequence();
for(let value of generator) {
alert(value); // ابتدا 1 ٠سپس 2
}
اÛÙ Ø´ÛÙ٠از صدا کرد٠next تÙ
ÛØ²ØªØ± Ø§Ø³ØªØ Ø§ÛÙâÚ¯ÙÙÙ Ùکر ÙÙ
ÛâÚ©ÙÛØ¯Ø
â¦Ø§Ù
ا Ø¯ÙØª Ú©ÙÛØ¯: Ù
Ø«Ø§Ù Ø¨Ø§ÙØ§ ابتدا 1 ٠سپس 2 را ÙØ´Ø§Ù Ø¯Ø§Ø¯Ø Ø®Ø¨Ø±Û Ø§Ø² 3 ÙÛØ³Øª!
Ø¹ÙØª اÛÙ Ø§ØªÙØ§Ù اÛ٠است Ú©Ù for..of آخرÛÙ Ù
ÙØ¯Ø§Ø± را ÙÙگاÙ
Û Ú©Ù done:true است در ÙØ¸Ø± ÙÙ
ÛâÚ¯ÛØ±Ø¯. آخرÛÙ Ù
ÙØ¯Ø§Ø± Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù شد٠با returnØ Ø¨Ø± Ø®ÙØ§Ù yieldØ ØØ§ÙÛ done:true است. در ÙØªÛØ¬Ù Ø¨Ø±Ø§Û ÙØ´Ø§Ù داد٠تÙ
اÙ
Ù
ÙØ§Ø¯Ûر در ØÙÙÙ for..of Ø¨Ø§ÛØ¯ Ø¢ÙâÙØ§ را با yield برگرداÙÛÙ
:
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
let generator = generateSequence();
for(let value of generator) {
alert(value); // ابتدا 1 سپس 2 ٠بعد از آ٠3
}
از Ø¢ÙØ¬Ø§ÛÛ Ú©Ù generatorÙØ§ ØÙÙÙâÙ¾Ø°ÛØ± ÙØ³ØªÙØ¯Ø Ø§Ø² تÙ
اÙ
functionality Ø¢ÙâÙØ§ ÙÛØ² Ø¨Ø±Ø§Û generatorÙØ§ Ù
ÛâØªÙØ§Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©Ø±Ø¯Ø Ù
ث٠spread syntax ...:
function* generateSequence() {
yield 1;
yield 2;
yield 3;
}
let sequence = [0, ...generateSequence()];
alert(sequence); // 0, 1, 2, 3
در کد Ø¨Ø§ÙØ§Ø ()generateSequence...Ø Ø¨Ø§Ø¹Ø« Ù
ÛâØ´ÙØ¯ Ø´ÛØ¡ generator Ú©Ù ØÙÙÙâÙ¾Ø°ÛØ± ÙÙ
ÙØ³Øª ب٠آراÛÙâØ§Û Ø§Ø² اعداد تبدÛÙ Ø´ÙØ¯.(دربار٠spread syntax در ÙØµÙ پاراÙ
ØªØ±ÙØ§Û رست ٠سÛÙØªÚ©Ø³ اسپرد Ø¨ÛØ´ØªØ± Ø¨Ø®ÙØ§ÙÛØ¯.)
Ø§Ø³ØªÙØ§Ø¯Ù از generatorÙØ§ Ø¨Ø±Ø§Û ØÙÙÙâÙ¾Ø°ÛØ±Ùا
در Úپتر ØÙÙÙâÙ¾Ø°ÛØ±Ùا ÛÚ© Ø´ÛØ¡ range ساختÛÙ
Ú©Ù Ù
ÙØ§Ø¯Ûر from..to را باز Ù
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯.
کد Ø¢Ù Ø¨Ù Ø´Ø±Ø Ø²ÛØ± Ø¨ÙØ¯:
let range = {
from: 1,
to: 5,
// در ابتدا اÛÙ Ù
ØªÙØ¯ را ÙÙØ· ÛÚ© بار صدا Ù
ÛâÚ©ÙØ¯ for..of range
[Symbol.iterator]() {
// اÛÙØ Ø´ÛØ¡ Ø§ÛØªØ±ÛØªÙØ± را باز Ù
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯:
// ÙÙØ· با Ø¢Ù Ø´ÛØ¡ کار Ù
ÛâÚ©ÙØ¯ ٠از Ø¢Ù Ù
ÙØ§Ø¯Ûر Ø¨Ø¹Ø¯Û Ø±Ø§ Ù
ÛâØ®ÙØ§Ùد for..of سپس
return {
current: this.from,
last: this.to,
// صدا Ù
ÛâØ´ÙØ¯ for..of ØªÙØ³Ø· iteration در ÙØ± next()
next() {
// {value: ..., done: ...}:Ø¨Ø§ÛØ¯ Ù
ÙØ¯Ø§Ø± را ب٠عÙÙØ§Ù ÛÚ© Ø´ÛØ¡ Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
};
},
};
// برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ range.to تا range.from اعداد را از range رÙÛ iteration
alert([...range]); // 1,2,3,4,5
Ù ÛâØªÙØ§Ù از ÛÚ© تابع generator Ø¨Ø±Ø§Û iteration Ø¨Ù Ø¬Ø§Û Symbol.iterator Ø§Ø³ØªÙØ§Ø¯Ù کرد.
اÛÙ ÙÙ
ا٠range اÙ
ا Ø¨Ø³ÛØ§Ø± جÙ
ع Ù Ø¬ÙØ± تر است:
let range = {
from: 1,
to: 5,
*[Symbol.iterator]() {//[Symbol.iterator] ÙØ³Ø®Ù جÙ
ع Ù Ø¬ÙØ± : function*()
for (let value = this.from; value <= this.to; value++) {
yield value;
}
},
};
alert([...range]); // 1,2,3,4,5
دÙÛ٠کارکرد Ø±ÙØ´ Ø¨Ø§ÙØ§ اÛ٠است Ú©Ù ()range[Symbol.iterator] دÙÛÙØ§ ÙÙ
ا٠ÚÛØ²Û را برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ Ú©Ù for..of Ø§ÙØªØ¸Ø§Ø± دارد:
- Ù
ØªÙØ¯
nextÙ ÙØ¬Ùد است. - Ù
ÙØ¯Ø§Ø± Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ø¨Ù ÙØ±Ù
{value:..., done:true/false}است.
اÛ٠کارکرد ÛÚ© Ø§ØªÙØ§Ù ÙÛØ³ØªØ generatorÙØ§ با ØªÙØ¬Ù ب٠iterator ÙØ§Ø Ø¨Ø±Ø§Û Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ø³Ø§Ø¯ÙâØªØ± Ø¢ÙâÙØ§ ب٠زبا٠اضاÙ٠شدÙâØ§ÙØ¯.
Ø±ÙØ´Û ک٠از generator Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâÚ©ÙØ¯ Ø¨Ø³ÛØ§Ø± Ù
ختصرتر از Ø±ÙØ´ اÙÙ range است Ù ÙÙ
ا٠کارکرد را دارد.
در Ù Ø«Ø§Ù Ø¨Ø§ÙØ§Ø ÛÚ© Ø¯ÙØ¨Ø§Ù٠کراÙâØ¯Ø§Ø± تÙÙÛØ¯ کردÛÙ Ø ÙÙÛ Ù ÛâØªÙØ§Ù ب٠ÙÙ Ø§Ù Ø±ÙØ´ ÛÚ© Ø¯ÙØ¨Ø§Ù٠بÛâکرا٠از Ù ÙØ§Ø¯Ûر را ساخت. ٠ث٠ÛÚ© Ø¯ÙØ¨Ø§Ù٠بÛâÙ¾Ø§ÛØ§Ù از اعداد شب٠تصادÙÛ.
ÚÙÛÙ Ú©Ø§Ø±Ø¨Ø±Ø¯Û ÙØ·Ø¹Ø§ ب٠ÛÚ© break ÛØ§ return در for..of ÙÛØ§Ø² دارد. در ØºÛØ± اÛÙ ØµÙØ±Øª ØÙÙ٠تا ابد تکرار Ù
ÛâØ´ÙØ¯.
ØªØ±Ú©ÛØ¨ generatorÙØ§
ØªØ±Ú©ÛØ¨ generatorÙØ§ ÙØ§Ø¨ÙÛØªÛ است Ú©Ù Ø¨Ù ÙØ³ÛÙ٠آ٠Ù
ÛâØªÙØ§Ù generatorÙØ§ را در ÙÙ
embed کرد.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù ÛÚ© generator دارÛÙ Ú©Ù ÛÚ© Ø¯ÙØ¨Ø§Ù٠از اعداد را تÙÙÛØ¯ Ù ÛâÚ©ÙØ¯:
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
اکÙÙÙ Ù ÛââØ®ÙØ§ÙÛ٠از Ø¢Ù Ø¨Ù ÙØÙÛ Ø¨Ø§Ø²Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ Ú©Ù Ø¯ÙØ¨Ø§ÙÙ Ù¾ÛÚÛØ¯ÙâØªØ±Û Ø¨ØªÙØ§Ù Ø§ÛØ¬Ø§Ø¯ کرد:
- ابتدا Ø§Ø±ÙØ§Ù
از
0تا9(با کد کاراکتر 48 تا 57) - سپس ØØ±Ù٠بزرگ از
AتاZ(با کد کاراکتر 65 تا 90) - سپس ØØ±ÙÙ Ú©ÙÚÚ© از
aتاz(با کد کاراکتر 97 تا 122)
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù Ø§Ø² اÛÙ Ø¯ÙØ¨Ø§ÙÙ Ù ÛâØªÙØ§Ù با Ø§ÙØªØ®Ø§Ø¨ Ú©Ø§Ø±Ø§Ú©ØªØ±Ø Ø¨Ø±Ø§Û ØªÙÙÛØ¯ ر٠ز Ø¹Ø¨ÙØ± Ø§Ø³ØªÙØ§Ø¯Ù کرد.
در ØªÙØ§Ø¨Ø¹ Ù
عÙ
ÙÙÛØ Ø¨Ø±Ø§Û ØªØ±Ú©ÛØ¨ Ø¬ÙØ§Ø¨âÙØ§ از ÚÙØ¯Û٠تابع دÛÚ¯Ø±Ø Ø¢ÙâÙØ§ را صدا Ù
ÛâÚ©ÙÛÙ
Ø Ù
ÙØ§Ø¯Ûر را Ø°Ø®ÛØ±Ù Ù
ÛâÚ©ÙÛÙ
٠سپس در آخر Ø¢ÙâÙØ§ را ب٠ÙÙ
join Ù
ÛâÚ©ÙÛÙ
.
Ø¨Ø±Ø§Û generatorÙØ§ سÛÙØªÚ©Ø³*yield Ø¨Ø±Ø§Û âembedâ کرد٠ÛÚ© generator درÙ٠دÛÚ¯Ø±Û Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙØ¯.
generator ØªØ±Ú©ÛØ¨ شدÙ:
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
function* generatePasswordCodes() {
// 0..9
yield* generateSequence(48, 57);
// A..Z
yield* generateSequence(65, 90);
// a..z
yield* generateSequence(97, 122);
}
let str = '';
for(let code of generatePasswordCodes()) {
str += String.fromCharCode(code);
}
alert(str); // 0..9A..Za..z
عبارت *yield اجرا را ب٠ÛÚ© generator دÛگر Ù
ÛâØ³Ù¾Ø§Ø±Ø¯(Ø§ØµØ·ÙØ§ØØ§ delegate Ù
ÛâÚ©ÙØ¯). بدا٠Ù
Ø¹ÙØ§ Ú©Ù yeild* gen رÙÛ gen Ø§ÛØªØ±Ûت Ù
ÛâÚ©ÙØ¯ Ù Ø¨Ù ØµÙØ±Øª درÙÙÛ Ù
ÙØ¯Ø§Ø± yield شد٠را Ø¨Ù Ø¨ÛØ±ÙÙ ÙØ¯Ø§Ûت Ù
ÛâÚ©ÙØ¯Ø اÙگار Ú©Ù Ú©ÙØ§ Ù
ÙØ¯Ø§Ø± ØªÙØ³Ø· generator دÙÙ
تÙÙÛØ¯ شد٠است.
اگر از generatorÙØ§ Ø¨Ù ØµÙØ±Øª inline ٠ت٠در ØªÙ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ ÙÛØ² ب٠ÙÙ Ø§Ù ÙØªÛج٠٠ÛâØ±Ø³ÛÙ :
function* generateSequence(start, end) {
for (let i = start; i <= end; i++) yield i;
}
function* generateAlphaNum() {
// yield* generateSequence(48, 57);
for (let i = 48; i <= 57; i++) yield i;
// yield* generateSequence(65, 90);
for (let i = 65; i <= 90; i++) yield i;
// yield* generateSequence(97, 122);
for (let i = 97; i <= 122; i++) yield i;
}
let str = '';
for(let code of generateAlphaNum()) {
str += String.fromCharCode(code);
}
alert(str); // 0..9A..Za..z
ØªØ±Ú©ÛØ¨ generatorÙØ§ ÛÚ© را٠٠عÙÙÙ Ø¨Ø±Ø§Û Ø§Ø³ØªÙØ§Ø¯Ù از Ø¬Ø±ÛØ§Ù ÛÚ© generator درÙ٠دÛÚ¯Ø±Û Ø§Ø³Øª ٠از ØØ§ÙØ¸Ù Ø¨ÛØ´ØªØ± Ø¨Ø±Ø§Û Ø°Ø®ÛØ±Ù Ù ÙØ§Ø¯Ûر Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâÚ©ÙØ¯.
yield ÛÚ© Ø®ÛØ§Ø¨Ø§Ù د٠طرÙ٠است.
تا Ø§ÙØ§ÙØ generatorÙØ§ Ø¨Ø³ÛØ§Ø± شبÛÙ Ø¨Ù Ø´ÛØ¡ÙØ§Û ØÙÙÙâÙ¾Ø°ÛØ± با ÛÚ© سÛÙØªÚ©Ø³ خاص Ø¨Ø±Ø§Û ØªÙÙÛØ¯ Ù ÙØ§Ø¯Ûر Ø¨ÙØ¯ÙØ¯Ø Ø¯Ø±ÙØ§Ùع ا٠ا generatorÙØ§ Ø¨Ø³ÛØ§Ø± ÙØ¯Ø±ØªÙ ÙØ¯ØªØ± Ù Ø§ÙØ¹Ø·Ø§Ù Ù¾Ø°ÛØ±ØªØ± ÙØ³ØªÙد.
ÚÙÙ yield ÛÚ© Ø®ÛØ§Ø¨Ø§Ù د٠طرÙ٠است: Ù٠تÙÙØ§ Ù
ÙØ¯Ø§Ø± را Ø¨Ù Ø¨ÛØ±Ù٠برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ بÙÚ©Ù Ù
ÛâØªÙØ§Ùد Ù
ÙØ§Ø¯Ûر را ب٠داخ٠generator Ø¨ÛØ§Ùرد.
Ø¨Ø±Ø§Û Ø§Û٠کار Ø¨Ø§ÛØ¯ ()generator.next را با ÛÚ© آرگÙÙ
ا٠صدا Ú©ÙÛÙ
. اÛÙ argument تبدÛ٠ب٠Ù
ÙØ¯Ø§Ø± Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ø´Ø¯Ù ØªÙØ³Ø· Ø®ÙØ¯ yield درÙÙ generator Ù
ÛâØ´ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
function* gen() {
// ÛÚ© Ø³ÙØ§Ù را ب٠کد Ø¨ÛØ±ÙÙÛ Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙÛØ¯ Ù Ù
ÙØªØ¸Ø± Ø¬ÙØ§Ø¨ Ø´ÙÛØ¯
let result = yield "2 + 2 = ?"; // (*)
alert(result);
}
let generator = gen();
let question = generator.next().value; // <-- Ù
ÙØ¯Ø§Ø± را بر Ù
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ yield
generator.next(4); // --> برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ generator ÙØªÛج٠را بÙ
- ÙÙ
ÛâØªÙØ§Ù اÙÙÛ٠بار Ú©Ù
()generator.nextصدا Ù ÛâØ´ÙØ¯ ب٠آ٠argument داد ٠در ØµÙØ±Øª Ø¯Ø§Ø¯Ù Ø´Ø¯ÙØ ÙØ§Ø¯Ûد Ú¯Ø±ÙØªÙ Ø®ÙØ§Ùد شد. پس از صدا Ø´Ø¯Ù Ù ØªÙØ¯Ø Ø§Ø¬Ø±Ø§Û generator Ø´Ø±ÙØ¹ Ù ÛâØ´ÙØ¯ Ù Ù ÙØ¯Ø§Ø± اÙÙÛÙ yield را بر٠ÛâÚ¯Ø±Ø¯Ø§ÙØ¯. اکÙÙÙ Ø§Ø¬Ø±Ø§Û generator ٠تÙÙ٠شد٠٠در خط*Ù Ø§ÙØ¯Ù است. - سپس Ù
اÙÙØ¯ تصÙÛØ± Ø¨Ø§ÙØ§Ø ÙØªÛج٠yield اÙ٠در Ù
ØªØºÛØ±
questionØ°Ø®ÛØ±Ù Ù ÛâØ´ÙØ¯. - با اجراÛ
generator.next(4)Ø Ø§Ø¬Ø±Ø§Û generator Ø¯ÙØ¨Ø§Ø±Ù Ø´Ø±ÙØ¹ Ù ÛââØ´ÙØ¯ Ù Ù ÙØ¯Ø§Ø± Ù ØªØºÛØ±resultبرابر4Ù ÛâØ´ÙØ¯.
ØªÙØ¬Ù Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÛØ¯ Ú©Ù ÙÛØ§Ø² ÙÛØ³Øª کد Ø¨ÛØ±ÙÙÛ ÙÙØ±Ø§ (4)next را صدا Ú©ÙØ¯Ø اگر Ø·ÙÙ Ø¨Ú©Ø´Ø¯Ø generator صبر Ø®ÙØ§Ùد کرد.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
// پس از ØªØ§Ø®ÛØ±Û Ø¯ÙØ¨Ø§Ø±Ù Ø´Ø±ÙØ¹ Ù
ÛâØ´ÙØ¯ generator اجراÛ
setTimeout(() => generator.next(4), 1000);
ÙÙ
اÙâØ·ÙØ± Ú©Ù Ù
Ø´Ø§ÙØ¯Ù Ù
ÛâØ´ÙØ¯ بر Ø®ÙØ§Ù ØªÙØ§Ø¨Ø¹ Ù
عÙ
ÙÙÛØ ÛÚ© generator ٠کد صدا زÙÙØ¯ÙâØ§Ø´ Ù
ÛâØªÙØ§ÙÙØ¯ با ÙÙ
Ù
ÙØ§Ø¯Ûر را از طرÛÙ next/yield رد ٠بد٠کÙÙØ¯.
ÛÚ© ٠ثا٠دÛگر:
function* gen() {
let ask1 = yield "2 + 2 = ?";
alert(ask1); // 4
let ask2 = yield "3 * 3 = ?";
alert(ask2); // 9
}
let generator = gen();
alert(generator.next().value); // "2 + 2 = ?"
alert(generator.next(4).value); // "3 * 3 = ?"
alert(generator.next(9).done); // true
تصÙÛØ± اجرا:
- اÙÙÛÙ
()nextØ§Ø¬Ø±Ø§Û generator را آغاز Ù ÛâÚ©ÙØ¯ تا ب٠اÙÙÛÙ yield برسد. - ÙØªÛج٠ب٠کد Ø¨ÛØ±ÙÙÛ Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ù ÛâØ´ÙØ¯.
- صدا زد٠شدÙ
next(4)Ù ÙØ¯Ø§Ø±4را ب٠generator ب٠عÙÙØ§Ù ÙØªÛج٠اÙÙÛÙ yield باز Ù ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ Ù Ø§Ø¬Ø±Ø§Û generator را Ø¯ÙØ¨Ø§Ø±Ù Ø´Ø±ÙØ¹ Ù ÛâÚ©ÙØ¯. - ب٠yield دÙÙ
Ù
ÛâØ±Ø³Ø¯ Ù Ù
ÙØ¯Ø§Ø± Ø¢Ù ÙØªÛج٠دÙÙ
Û٠بار صدا شدÙ
nextاست. - صدا زد٠شدÙ
next(9)Ù ÙØ¯Ø§Ø±9را ب٠عÙÙØ§Ù ÙØªÛج٠دÙÙ ÛÙ yield بر٠ÛâÚ¯Ø±Ø¯Ø§ÙØ¯ Ù Ø§Ø¬Ø±Ø§Û generator Ø¯ÙØ¨Ø§Ø±Ù Ø´Ø±ÙØ¹ Ù ÛâØ´ÙØ¯ تا Ø¨Ù Ø§ÙØªÙØ§Û ØªØ§Ø¨Ø¹Ødone:trueبرسد.
درست Ù
Ø«Ù Ø¨Ø§Ø²Û Ù¾ÛÙÚ¯ Ù¾ÙÚ¯Ø (value)next ÛÚ© Ù
ÙØ¯Ø§Ø± را ب٠generator پاس Ù
ÛâØ¯ÙØ¯ Ú©Ù ÙØªÛج٠yield ÙØ¹ÙÛ Ù
ÛâØ´ÙØ¯ ٠سپس ÙØªÛج٠yield Ø¨Ø¹Ø¯Û Ø¨Ù Ø¨ÛØ±Ù٠پاس داد٠Ù
ÛâØ´ÙØ¯.
generator.throw
Ù٠اÙâØ·ÙØ± ک٠در ٠ثاÙâÙØ§Û Ø¨Ø§ÙØ§ Ø¯ÛØ¯ÛÙ Ø Ú©Ø¯ Ø¨ÛØ±ÙÙÛ Ù ÛâØªÙØ§Ùد ÛÚ© Ù ÙØ¯Ø§Ø± را ب٠generator در Ø¬ÙØ§Ø¨ yield پاس Ø¨Ø¯ÙØ¯.
â¦Ø§Ù ا Ù ÛâØªÙØ§Ùد در Ø¢Ù ØÛÙ ÛÚ© Ø§Ø±ÙØ± پرتاب Ú©ÙØ¯ Ú©Ù Ø·Ø¨ÛØ¹Û Ø§Ø³ØªØ ÚÙÙ Ø§Ø±ÙØ± ÙÛØ² ÛÚ© Ø¬ÙØ± ÙØªÛج٠است.
Ø¨Ø±Ø§Û Ø§ÛÙÚ©Ù ÛÚ© Ø§Ø±ÙØ± را ب٠yield پاس بدÙÛÙ
Ø Ø¨Ø§ÛØ¯ (err)genrator.throw را صدا Ú©ÙÛÙ
. در اÛÙ ØµÙØ±ØªØ err در خط با yield پرتاب Ù
ÛâØ´ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù Ø§ÛÙØ¬Ø§ yield شد٠â2 + 2 = ?â Ø¨Ø§Ø¹Ø« Ø§Ø±ÙØ± Ù ÛâØ´ÙØ¯:
function* gen() {
try {
let result = yield "2 + 2 = ?"; // (1)
alert("اجرا ب٠اÛÙØ¬Ø§ ÙÙ
ÛâØ±Ø³Ø¯ ÚÙ٠خط Ø¨Ø§ÙØ§ Ø§Ø±ÙØ± پرتاب کرد٠است");
} catch(e) {
alert(e); // Ø§Ø±ÙØ± را ÙØ´Ø§Ù Ù
ÛâØ¯ÙØ¯
}
}
let generator = gen();
let question = generator.next().value;
generator.throw(new Error("پاسخ در Ø¯ÛØªØ§Ø¨Ûس Ù
Ù ÙÛØ³Øª")); // (2)
Ø§Ø±ÙØ± پرتاب شد٠ب٠داخ٠generator در خط 2 باعث exception در خط 1 Ø¯Ø§Ø±Ø§Û yield Ù
ÛâØ´ÙØ¯ ک٠در Ù
Ø«Ø§Ù Ø¨Ø§ÙØ§ ØªÙØ³Ø· try..catch Ú¯Ø±ÙØªÙ شد٠٠ÙÙ
Ø§ÛØ´ داد٠Ù
ÛâØ´ÙØ¯.
اگر آ٠را catch ÙÚ©ÙÛÙ Ø Ù Ø§ÙÙØ¯ ÙØ± exception دÛÚ¯Ø±Û Ø§Ø¬Ø±Ø§ از generator ب٠کد Ø¨ÛØ±ÙÙÛ Ù ÙØªÙÙ Ù ÛâØ´ÙØ¯.
خط ÙØ¹ÙÛ Ú©Ø¯ صدا زÙÙØ¯ÙØ Ø®Ø· Ø¯Ø§Ø±Ø§Û generator.throw با ÙÛØ¨Ù 2 است. پس خطا را اÛÙ Ú¯ÙÙÙ ÙÙ
Ù
ÛâØªÙØ§Ù Ú¯Ø±ÙØª:
function* generate() {
let result = yield "2 + 2 = ?"; // خطا در اÛ٠خط
}
let generator = generate();
let question = generator.next().value;
try {
generator.throw(new Error("پاسخ در Ø¯ÛØªØ§Ø¨Ûس Ù
Ù ÙÛØ³Øª"));
} catch(e) {
alert(e); // Ø§Ø±ÙØ± را ÙÙ
Ø§ÛØ´ Ù
ÛâØ¯ÙØ¯
}
اگر Ø§Ø±ÙØ± را catch ÙÚ©ÙÛÙ Ø Ø¯Ø± ØµÙØ±Øª ÙØ¬Ùد کد Ø¨ÛØ±ÙÙÛ Ø§Ø¬Ø±Ø§ Ø¨Ù Ø¢Ù Ù ÙØªÙÙ Ù ÛâØ´ÙØ¯ ٠اگر Ø¢ÙâØ¬Ø§ ÙÛØ² ÙÙØ¯Ù ÙØ´Ø¯Ù Ø¨Ø§Ø´Ø¯Ø Ø§Ø¬Ø±Ø§Û Ú©Ø¯ با خطا Ù¾Ø§ÛØ§Ù Ù ÛâÙ¾Ø°ÛØ±Ø¯.
generator.return
اÛÙ Ù ØªÙØ¯ Ø§Ø¬Ø±Ø§Û generator را ب٠ات٠ا٠٠ÛâØ±Ø³Ø§ÙØ¯ Ù Ù ÙØ¯Ø§Ø± argument را ب٠عÙÙØ§Ù ÙØªÛج٠بر٠ÛâÚ¯Ø±Ø¯Ø§ÙØ¯.
function* gen() {
yield 1;
yield 2;
yield 3;
}
const g = gen();
g.next(); // { value: 1, done: false }
g.return("foo"); // { value: "foo", done: true }
g.next(); // { value: undefined, done: true }
اگر در ÛÚ© generatorخاتÙ
Ù ÛØ§ÙØªÙ Ø¯ÙØ¨Ø§Ø±Ù از ()generator.returnØ§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø ÙÙ
ا٠Ù
ÙØ¯Ø§Ø± را Ø¯ÙØ¨Ø§Ø±Ù برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯.(MDN).
٠ع٠ÙÙØ§ از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ ÛâØ´ÙØ¯Ø ÚÙ٠اکثر ز٠اÙâÙØ§ Ù ÛâØ®ÙØ§ÙÛÙ ØªÙ Ø§Ù Ù ÙØ§Ø¯Ûر را Ø¨Ú¯ÛØ±ÛÙ Ø Ø§Ù Ø§ Ù ÙÙØ¹Û Ú©Ù Ø¨Ø®ÙØ§ÙÛ٠در Ø´Ø±Ø§ÛØ· خاص generator را ٠تÙÙÙ Ú©ÙÛ٠کاربرد دارد.
Ø®ÙØ§ØµÙ
- generatorÙØ§ ØªÙØ³Ø· تابع generator تÙÙÛØ¯ Ù
ÛâØ´ÙÙØ¯.
{...} (...) function* f - ع٠Ùگر yield (ÙÙØ·) در داخ٠generatorÙØ§ ÙØ¬Ùد دارد.
- کد Ø¨ÛØ±ÙÙÛ Ù generator Ù
Ù
ک٠است ØªÙØ³Ø·
next/yieldبا ÙÙ ÙØªØ§Ûج را رد ٠بد٠کÙÙØ¯.
در Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù Ø¯Ø±ÙØ generatorÙØ§ Ú©Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙÙØ¯. ا٠ا گاÙÛ Ø§ÙÙØ§Øª Ù ÛâØªÙØ§ÙÙØ¯ Ù ÙÛØ¯ Ø¨Ø§Ø´ÙØ¯Ø رد ٠بد٠کرد٠داد٠با کد صدا زÙÙØ¯ÙØ ÛÚ© ÙØ§Ø¨ÙÛØª Ù ÙØØµØ± Ø¨ÙØ±Ø¯ است. ÙÙ âÚÙÛÙ Ø¨Ø±Ø§Û Ø³Ø§Ø®Øª ØÙÙÙâÙ¾Ø°ÛØ±Ùا Ù٠بکار Ù ÛâØ±ÙÙØ¯.
Ø¹ÙØ§Ù٠بر Ø¢ÙØ در Úپتر Ø¨Ø¹Ø¯ÛØ async generatorÙØ§ را ÛØ§Ø¯ Ø®ÙØ§ÙÛÙ
Ú¯Ø±ÙØª Ú©Ù Ø¨Ø±Ø§Û Ø®ÙØ§ÙØ¯Ù Ø¬Ø±ÛØ§ÙâÙØ§Û asynchronously generated data Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛâØ´ÙØ¯Ø Ù
Ø«ÙØ§ fetchÙØ§Û paginatedشد٠در Ø´Ø¨Ú©Ù ØªÙØ³Ø· for await...of loop.
از Ø¢ÙØ¬Ø§ÛÛ Ú©Ù Ø¯Ø± Ø¨Ø±ÙØ§Ù Ù ÙÙÛØ³Û ÙØ¨Ø با Ø¬Ø±ÛØ§ÙâÙØ§Û Ø¯Ø§Ø¯ÙØ Ø²ÛØ§Ø¯ سر ٠کار دارÛ٠اÛÙ ÛÚ© کاربرد Ø¨Ø³ÛØ§Ø± Ù Ù٠است.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)