Iterators and Generators
Yield Steps
Yield labels around a repeated action.
yield-steps
Each `yield` can expose a named step in a longer process. The generator keeps its local state between yielded values.
Yield Steps
yield_steps.js
Replay: real traced execution (multi-file project)
const prefix = "step";
const labels = [];
function* steps(label) {
yield label + "-start";
yield label + "-middle";
yield label + "-end";
}
for (const label of steps(prefix)) {
labels.push(label);
}
console.log("prefix=" + prefix);
console.log("labels=" + labels.join("-"));
const prefix = "phase";
const labels = [];
function* steps(label) {
yield label + "-start";
yield label + "-middle";
yield label + "-end";
}
for (const label of steps(prefix)) {
labels.push(label);
}
console.log("prefix=" + prefix);
console.log("labels=" + labels.join("-"));
const prefix = "task";
const labels = [];
function* steps(label) {
yield label + "-start";
yield label + "-middle";
yield label + "-end";
}
for (const label of steps(prefix)) {
labels.push(label);
}
console.log("prefix=" + prefix);
console.log("labels=" + labels.join("-"));
prefix ← step, labels ← (empty)
1const prefix→ step = "step"; //@prefix="phase", "task"2const labels→ (empty) = [];function* steps(label)
1const prefix = "step"; //@prefix="phase", "task"2const labels = [];34function* steps(labelstep) {5 yield label + "-start";6 yield label + "-middle";labels ← step-start,step-middle,step-end, label ← step
4function* steps(label) {5 yield label→ step + "-start";6 yield label→ step + "-middle";7 yield label→ step + "-end";8}910for (const label of steps(prefix)) {11 labels.push(labelstep-end);12}1314console.log("prefix=" + prefixstep);15console.log("labels=" + labelsstep-start,step-middle,step-end.join("-"));outputprefix=step labels=step-start-step-middle-step-end
prefix ← phase, labels ← (empty)
1const prefix→ phase = "phase";2const labels→ (empty) = [];function* steps(label)
1const prefix = "phase";2const labels = [];34function* steps(labelphase) {5 yield label + "-start";6 yield label + "-middle";labels ← phase-start,phase-middle,phase-end, label ← phase
4function* steps(label) {5 yield label→ phase + "-start";6 yield label→ phase + "-middle";7 yield label→ phase + "-end";8}910for (const label of steps(prefix)) {11 labels.push(labelphase-end);12}1314console.log("prefix=" + prefixphase);15console.log("labels=" + labelsphase-start,phase-middle,phase-end.join("-"));outputprefix=phase labels=phase-start-phase-middle-phase-end
prefix ← task, labels ← (empty)
1const prefix→ task = "task";2const labels→ (empty) = [];function* steps(label)
1const prefix = "task";2const labels = [];34function* steps(labeltask) {5 yield label + "-start";6 yield label + "-middle";labels ← task-start,task-middle,task-end, label ← task
4function* steps(label) {5 yield label→ task + "-start";6 yield label→ task + "-middle";7 yield label→ task + "-end";8}910for (const label of steps(prefix)) {11 labels.push(labeltask-end);12}1314console.log("prefix=" + prefixtask);15console.log("labels=" + labelstask-start,task-middle,task-end.join("-"));outputprefix=task labels=task-start-task-middle-task-end