Generator对象不能直接实例化,只能由生成器函数返回生成,具有迭代功能。
function* infinite() { let index = 0; while (true) { yield index++; } } const generator = infinite(); // "Generator { }" console.log(generator.next().value); // 0 console.log(generator.next().value); // 1 console.log(generator.next().value); // 2 // ...
功能:返回具有 value 和 done 两个属性的对象,也可以传入参数。
// 实例1 function* gen() { yield 1; yield 2; yield 3; } const g = gen(); // "Generator { }" g.next(); // "Object { value: 1, done: false }" g.next(); // "Object { value: 2, done: false }" g.next(); // "Object { value: 3, done: false }" g.next(); // "Object { value: undefined, done: true }"
// 实例2 function* gen() { while (true) { let value = yield null; console.log(value); } } const g = gen(); g.next(1); // "{ value: null, done: false }" g.next(2); // 2 // "{ value: null, done: false }"
// 实例3 function* getPage(pageSize = 1, list) { let output = []; let index = 0; while (index < list.length) { output = []; for (let i = index; i < index + pageSize; i++) { if (list[i]) { output.push(list[i]); } } yield output; index += pageSize; } } list = [1, 2, 3, 4, 5, 6, 7, 8] var page = getPage(3, list); // Generator { } page.next(); // Object {value: (3) [1, 2, 3], done: false} page.next(); // Object {value: (3) [4, 5, 6], done: false} page.next(); // Object {value: (2) [7, 8], done: false} page.next(); // Object {value: undefined, done: true}
功能:立即返回,退出生成器。
// 实例1 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 }
// 实例2 function* gen() { yield 1; yield 2; yield 3; } const g = gen(); g.next(); // { value: 1, done: false } g.next(); // { value: 2, done: false } g.next(); // { value: 3, done: false } g.next(); // { value: undefined, done: true } g.return(); // { value: undefined, done: true } g.return(1); // { value: 1, done: true }
功能:抛出异常,返回包含 value 和 done 两个属性的对象。
function* gen() { while(true) { try { yield 42; } catch(e) { console.log('Error caught!'); } } } const g = gen(); g.next(); // { value: 42, done: false } g.throw(new Error('Something went wrong')); // "Error caught!" // { value: 42, done: false }