(13)es6——生成器函数

生成器函数的定义与使用

// 声明
function * fn() {
	// yield类似于断点
	console.log(111);
	yield '第一段'
	console.log(222);
	yield '第二段'
	console.log(333);
	yield '第三段'
	console.log(444);
}
// 调用
let iterator = fn();
// 生成器函数每次调用的时候都会生成一个新的支持迭代器的对象
console.log(iterator === iterator2); // false
/* 每次调用next会执行生成器函数中yield段代码,并且返回包含yield的值的对象
{value: 'yieldValue',done: false}或者{value:undefined,done:true}*/
			console.log(iterator.next());
			console.log(iterator.next());
			console.log(iterator.next());
			console.log(iterator.next());
			// 生成器函数是可以使用迭代器,迭代器相当于循环调用next执行到yield位置并返回yield的value值
			for(let i of fn()){
				console.log(i);
			}

在这里插入图片描述

给生成器函数传参

function* fn(arg) {
    console.log(arg); // AAA
    let one = yield 1;
    console.log(one); // BBB
    let two = yield 2;
    console.log(two); // CCC
    let three = yield 3;
    console.log(three); // DDD
}

// 执行获取迭代器对象
let iterator = fn('AAA');
iterator.next();
// 从第二次开始next的参数会成为yield的返回值
iterator.next('BBB');
iterator.next('CCC');
iterator.next('DDD');

在这里插入图片描述

给生成器函数异步传参

function getname() {
    setTimeout(() => {
        let name = 'zhangsan';
        iterator.next(name);
    }, 1000)
}

function getdata() {
    setTimeout(() => {
        let data = 'data';
        iterator.next(data);
    }, 2000)
}

function gettime() {
    setTimeout(() => {
        let time = 'time';
        iterator.next(time);
    }, 3000)
}

function* fn() {
    getname();
    // 可以使用一个变量去接收yield的返回值,yield返回上一次调用iterator.next()的参数
    let one = yield;
    console.log(one);
    getdata();
    let two = yield;
    console.log(two);
    gettime();
    let three = yield;
    console.log(three);
}

let iterator = fn();
iterator.next();

在这里插入图片描述

生成器函数的应用场景

解决回调地狱

// 异步任务,回调地狱
// setTimeout(() => {
// 	console.log(111);
// 	setTimeout(() => {
// 		console.log(222);
// 		setTimeout(() => {
// 			console.log(333);
// 		},3000)
// 	},2000)
// },1000)
function fn1() {
    setTimeout(() => {
        console.log(111);
        iterator.next();
    }, 1000)
}

function fn2() {
    setTimeout(() => {
        console.log(222);
        iterator.next();
    }, 1000)
}

function fn3() {
    setTimeout(() => {
        console.log(333);
        iterator.next();
    }, 1000)
}

function* fn() {
    fn1();
    yield;
    fn2();
    yield;
    fn3();
    yield;
}

let iterator = fn();
iterator.next();

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiuJie_Boom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值