Signatur
Beschreibung
take() gehört zu den Iterator Helpers und begrenzt einen Iterator auf eine bestimmte Anzahl von Elementen. Das Ergebnis ist ein neuer Iterator, der verzögert (lazy) arbeitet: Ein Element wird erst dann aus dem Quell-Iterator gelesen, wenn beim Ergebnis next() aufgerufen wird.
Besonders nützlich ist die Methode bei unendlichen oder sehr großen Folgen, etwa Generatoren für Zahlenfolgen, IDs oder paginierte Datenquellen. Statt eine Schleife mit Zähler und break zu schreiben, lässt sich die Begrenzung direkt in eine Kette aus filter(), map() und toArray() einbauen.
Wenn das Limit erreicht ist, ruft take() die Methode return() des zugrunde liegenden Iterators auf und schließt ihn damit. Bei Generatoren laufen dadurch finally-Blöcke, sodass Ressourcen sauber freigegeben werden. Endet die Quelle schon vor dem Limit, endet auch der Ergebnis-Iterator entsprechend früher.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $limit Pflicht | number | Maximale Anzahl zu liefernder Elemente. Wird zu einer Ganzzahl umgewandelt (Nachkommastellen werden abgeschnitten). Infinity ist erlaubt. Negative Werte oder NaN lösen einen RangeError aus. |
Rückgabewert
limit Elemente des ursprünglichen Iterators liefert und danach { value: undefined, done: true } zurückgibt.Beispiele
Unendlichen Generator begrenzen
function* fibonacci() {
let [a, b] = [0, 1];
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
// Nur die ersten 10 Fibonacci-Zahlen
const ersteZehn = fibonacci().take(10).toArray();
console.log(ersteZehn);
In einer Kette mit filter() und map()
const obst = ["apfel", "Birne", "kiwi", "Banane", "mango"];
// Arrays haben kein take() – daher über values() einen Iterator holen
const ergebnis = obst.values()
.filter((w) => w.length > 4)
.map((w) => w.toUpperCase())
.take(2)
.toArray();
console.log(ergebnis);
Quell-Iterator wird automatisch geschlossen
function* zaehler() {
try {
let i = 0;
while (true) yield i++;
} finally {
console.log("Ressource geschlossen");
}
}
for (const n of zaehler().take(3)) {
console.log(n);
}
Ungültiges Limit abfangen
const it = [1, 2, 3].values();
try {
it.take(-1);
} catch (err) {
console.log(err.name, err.message);
}
// Limit größer als die Quelle: endet einfach früher
console.log([...[1, 2, 3].values().take(10)]);
// Wichtig · Fallstricke
- Kein Array-Methode:
[1, 2, 3].take(2)schlägt mitTypeErrorfehl. Erst mitvalues(),entries(),keys()oderIterator.from()einen Iterator erzeugen. Für Arrays istslice(0, n)meist die einfachere Wahl. - Fehler beim Aufruf: Negative Werte oder
NaN(z. B.take(\"abc\")odertake()ohne Argument) werfen sofort einenRangeError, nicht erst beinext(). - Verzögerte Auswertung: Der Quell-Iterator wird erst bei
next()weitergeschaltet. Auchtake(0)schließt die Quelle erst beim erstennext()-Aufruf. - Einmal verbraucht: Iteratoren lassen sich nicht zurücksetzen. Nach dem Durchlaufen der Ergebnisse ist der Quell-Iterator geschlossen und kann nicht weiter genutzt werden.
- Kompatibilität: Iterator Helpers sind relativ neu (Baseline 2025). In älteren Browsern und Node.js-Versionen unter 22 ist ein Polyfill nötig, z. B. aus
core-js. Für asynchrone Iteratoren gibt estake()noch nicht standardisiert (Proposal „Async Iterator Helpers“).