generator & async

2 篇文章 0 订阅
这篇博客探讨了JavaScript中的生成器(generator)及其如何作为语法糖简化异步编程。通过示例展示了如何使用generator处理中断执行并利用yield关键字等待结果。同时,介绍了asyncFun函数,它自动迭代generator并处理异步操作,例如调用longTimeFn函数,无需手动调用next。
摘要由CSDN通过智能技术生成
generator 是一种语法糖 每个函数需要用 ‘*’ 来标识 (生成器)
// 生成器的这种方式 可以中断函数的执行  只有主动触发的时候才会继续执行下去
// generator 专有关键字  yield 等待结果
function* generator () {
	const list = [1, 2, 3]
	for (let i of list) {
		yield i
	}
}

let g = generator()
console.log(g.next())  // {value: 1, done: false}
console.log(g.next())  // {value: 2, done: false}
console.log(g.next())  // {value: 3, done: false}
console.log(g.next())  // {value: undefined, done: true}
// 所有的输出都结束后 done 为 true
async
function longTimeFn(time) {
	return new Promise((resolve) => {
		setTimeout(() => {
			resolve(time)
		}, time)
	})
}

// 问:传入一个 generator 不手动执行next 希望传入 generator 后 调用 函数 asyncFun  直接一次性输出
function asyncFun (generator) {
	const iterator = generator()
	const next = (data) => {
		const {
			value,
			done
		} = iterator.next(data)
		
		if (done) {
			return
		}

		value.then(data => {
			next(data)
		})
	}
	next()
}

asyncFun(function* () {
	let data = yield longTimeFn(1000)
	console.log(data)
	data = yield longTimeFn(2000)
	console.log(data)
	return data
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值