基本生成器的各种使用
function* foo() {
console.log('生成器函数开始执行~');
yield;
const v1 = 1;
console.log(v1);
yield;
const v2 = 2;
console.log(v2);
yield;
const v3 = 3;
console.log(v3);
console.log('生成器函数执行结束~');
};
const generator = foo();
generator.next();
generator.next();
generator.next();
generator.next();
function * bar() {
console.log('bar生成器函数开始执行~');
const v1 = 1, v2 = 2, v3 = 3;
console.log(v1);
console.log(v2);
console.log(v3);
console.log('bar生成器函数执行结束~');
};
bar().next();
const generator = (function* () {
console.log('可以log generator看看');
})();
console.log(generator);
console.log(generator.next());
(function* () {
console.log('链式调用');
})().next();
生成器的返回值
function* foo() {
console.log('生成器函数开始执行~');
yield 'yield返回的值';
console.log('生成器函数执行结束~');
return '返回的值会被iterator当作返回的value值';
};
const generator = foo();
console.log(generator.next());
console.log(generator.next());
console.log(generator.next());
生成器接收参数
function* foo(params) {
console.log(params);
const variable1 = yield 'yield1';
console.log(variable1);
const variable2 = yield 'yield' + variable1;
console.log(variable2);
return variable1 + variable2;
};
const generator = foo(1);
const result1 = generator.next(),
result2 = generator.next(2),
result3 = generator.next(3);
console.log(result1, result2, result3, generator.next());
生成器调用return、throw
function* foo() {
try {
console.log('start');
yield;
console.log('在我上面的yield调用return、throw我都不能执行了');
yield;
console.log('end');
} catch (err) {
console.error(err);
yield '害';
}
};
const generator1 = foo();
generator1.next();
console.log(generator1.return('return'));
const generator2 = foo();
generator2.next();
generator2.next();
console.log(generator2.throw('让你执行完我再throw好吧!'));
生成器替代迭代器
function* arrIterator(arr) {
for (const item of arr) {
yield item;
}
};
const iterator = arrIterator(['苏苏', '土狗', 'SharkDog'])
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
上面写法的语法糖
function* arrIterator(arr) {
yield* arr
};
const iterator = arrIterator(['苏苏', '土狗', 'SharkDog'])
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
生成器迭代指定返回内的所有数字
function* createNumber(start, end) {
while (start < end) yield start++;
};
const iterator = createNumber(2, 8);
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
生成器做可迭代类
class SelfInfo {
constructor(address, roomName, person) {
this.address = address;
this.roomName = roomName;
this.person = person;
};
*[Symbol.iterator]() {
yield* this.person;
}
};
const info = new SelfInfo('合肥', 'E5-1804', ['苏苏', '土狗', 'SharkDog']);
for (const iterator of info) console.log(iterator);
对象中使用生成器函数
const obj = {
arr: [1, 2, 3, 5, 8],
*foo() {
yield* this.arr;
}
};
const testObj = obj.foo();
for (const iterator of testObj) console.log(iterator);
console.log(testObj.next());
console.log(testObj.next());
console.log(testObj.next());
console.log(testObj.next());
console.log(testObj.next());
console.log(testObj.next());