Z
ZHANK
进阶技巧

迭代器与生成器

Symbol.iterator、Generator yield、异步迭代 for await...of

迭代器与生成器

Symbol.iterator 让任何对象可被 for...of 遍历;Generator 是实现迭代器的最简单方式。

学完本章你将: 掌握 Symbol.iterator、Generator yield、for await...of。


可迭代协议

javascript
// 实现 Symbol.iterator → 可被 for...of 遍历
const range = {
    from: 1, to: 5,
    [Symbol.iterator]() {
        let current = this.from;
        return {
            next() {
                if (current <= 5) return { value: current++, done: false };
                return { done: true };
            },
        };
    },
};

for (const n of range) console.log(n);  // 1 2 3 4 5
console.log([...range]);  // [1, 2, 3, 4, 5]

Generator 函数

javascript
function* fibonacci(limit) {
    let [a, b] = [0, 1];
    while (a <= limit) {
        yield a;
        [a, b] = [b, a + b];
    }
}

for (const n of fibonacci(50)) console.log(n);
// 0 1 1 2 3 5 8 13 21 34

异步迭代 for await...of

javascript
async function* fetchPages(urls) {
    for (const url of urls) {
        const resp = await fetch(url);
        yield await resp.json();
    }
}

for await (const data of fetchPages(["url1", "url2"])) {
    console.log(data);
}

yield* 委托

javascript
function* combined() {
    yield* [1, 2, 3];           // 委托给可迭代对象
    yield* fibonacci(5);        // 委托给另一个生成器
    yield "end";
}