مولدها (Generators)
«مولد (Generator)» تابعی ویژه است. مقدارها را یکی یکی می دهد. می تواند متوقف شود و دوباره ادامه دهد. این یعنی جریان داده مرحله ای و کم هزینه.
تعریف تابع مولد (function*)
تابع مولد با function* ساخته می شود. خروجی آن «شیء مولد» است، نه مقدار مستقیم.
function* myGenerator() {
// مقادیر را مرحله ای برگردان
}
پیمایش شیء مولد با for...of
شیء مولد «قابل تکرار» است. پس با for...of می چرخد و مقدارها را می دهد.
function* myStream() {
// return {value:1, done:false}
yield 1;
// return {value:2, done:false}
yield 2;
// return {value:3, done:true}
return 3;
}
let myGenerator = myStream();
for (const value of myGenerator) {
// کد برای هر مقدار
}
نکته: حلقه for...of هنگام done:true تمام می شود. پس مقدارِ return در حلقه دیده نمی شود.
کلمه کلیدی yield
yield اجرا را نگه می دارد و یک مقدار می دهد. سپس با next() ادامه می دهد.
function* myStream() {
// return {value:1, done:false}
yield 1;
// return {value:2, done:false}
yield 2;
// return {value:3, done:false}
yield 3;
}
let myGenerator = myStream();
for (const value of myGenerator) {
// کد برای هر مقدار
}
متدهای شیء مولد: next/return/throw
شیء مولد «تکرارگر» هم هست. پس متدهای next()، return() و throw() دارد.
function* countToTwo() {
yield 1;
yield 2;
}
const gen = countToTwo();
let a = gen.next();
let b = gen.next();
let c = gen.return("done");
// می توان خطا هم تزریق کرد
// gen.throw(new Error("stop"));
جمع بندی سریع
function*بساز؛ خروجی، شیء مولد است.yieldمقدار می دهد و اجرا را نگه می دارد.for...ofروی مولد می چرخد.next()ادامه می دهد؛return()تمام می کند.
مطالعه مرتبط: تکرارگرها و کنترل جریان.