Skip to content

生成器(Generators)

作用

  • 生成器函数是ES6提供的一种异步编程解决方案,语法与传统函数完全不同

特点

  • 声明和调用
js
function* gen() {
    console.log('1');
    yield '1-1';
    console.log('2');
    yield '2-2';
    console.log('3');
    yield '3-3';
    console.log('4');
}

let iterator = gen();

console.log(iterator.next()); // 1, {value: '1-1', done: false}
console.log(iterator.next()); // 2, {value: '2-2', done: false}
console.log(iterator.next()); // 3, {value: '3-3', done: false}
console.log(iterator.next()); // 4, {value: undefined, done: true}

//遍历
for (let v of gen()) {
    console.log(v); // 1, 1-1, 2, 2-2, 3, 3-3, 4
}
  • 生成器函数参数传递
js
function* gen(arg) {
    console.log(arg); // aa
    let one = yield 11;
    console.log(one); // bb
    let two = yield 22;
    console.log(two); // cc
    let three = yield 33;
    console.log(three); // dd
}

// 执行获取迭代器对象
let iterator = gen('aa');
console.log(iterator.next()); // {value: '11', done: false}
// next参数可以传入实参
console.log(iterator.next('bb')); // {value: '22', done: false}
console.log(iterator.next('cc')); // {value: '33', done: false}
console.log(iterator.next('dd')); // {value: undefined, done: true}
  • 异步编程简单实例

1s 后输出111, 2s后输出222, 3s后输出333

js
// 回调地狱模式
// setTimeout(() => {
// 	console.log(111);
// 	setTimeout(() => {
// 		console.log(222);
// 		setTimeout(() => {
// 			console.log(333);
// 		}, 3000);
// 	}, 2000);
// }, 1000);

// 生成器函数
function one() {
    setTimeout(() => {
        console.log(111);
        iterator.next();
    }, 1000);
}
function two() {
    setTimeout(() => {
        console.log(222);
        iterator.next();
    }, 2000);
}
function three() {
    setTimeout(() => {
        console.log(333);
        iterator.next();
    }, 3000);
}

function* gen() {
    yield one();
    yield two();
    yield three();
}

// 执行获取迭代器对象
let iterator = gen();
iterator.next();

Released under the MIT License.