# 正文
ES8推出的async/await允许我们用更加优雅的方式来实现异步代码,从某种角度上来说,它是Generator函数的语法糖,就像我们经常说class是构造函数的语法糖一样。
# async案例
基本用法啥的我就不说了,这里直接上一个简单的案例,后面一步步的转换过程都是以此案例作为基础。
const getData = () => new Promise(resolve => setTimeout(() => { resolve('data') }, 1000))
async function test () {
const data = await getData();
console.log('data: ', data);
const data2 = await getData();
console.log('data2: ', data2);
return 'success';
}
test().then(res => console.log(res));
@前端进阶之旅: 代码已经复制到剪贴板
针对于上面的这段代码,相信大家都没有什么疑问,很快我们就能说出答案:
// 1s 后打印出
'data ' 'data'
// 1s 后打印出
'data2: ' 'data'
'success'
@前端进阶之旅: 代码已经复制到剪贴板
# Generator案例
让我们先来回顾一下Generator最基本的一些概念:
function后面加上*表示这是一个Generator函数,如function* testG(){}- 函数内部可以使用
yield来中断函数的执行,即当每次执行到yield语句的时候,函数暂停执行 - 暂停执行之后,需要调用
next()才会继续执行Generator函数,直到碰到函数内下一个yield又会暂停 - 以此循环,直到函数内有
return或者函数内代码全部执行完
其中还有很重要的一个知识点,就是每次调用next()的返回值,它是一个对象,这个对象会有两个属性:
value:yield语句后的表达式的结果done:当前的Generator对象的逻辑块是否执行完成
如果说我们把上面的案例转换为Generator来实现的话,我们想的可能会是这样来写:
案例一:
const getData = () => new Promise(resolve => setTimeout(() => { 