生成器(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();