参考:https://juejin.cn/post/7007031572238958629?searchId=20240704101813568E9B5B1013C881A239#heading-15
总结一下async/await的知识点
1、 await只能在async函数中使用,不然会报错
2、 async函数返回的是一个Promise对象,有无值看有无return值
3、await后面最好是接Promise,虽然接其他值也能达到排队效果
4、async/await作用是用同步方式,执行异步操作
在学习async/await的时候也可以,需要知道async/await是语法糖
是谁的语法糖?
可以了解generator函数
generator函数基本用法
generator函数跟普通函数在写法上的区别就是,多了一个星号*,并且只有在generator函数中才能使用yield,什么是yield呢,他相当于generator函数执行的中途暂停点,比如下方有3个暂停点。而怎么才能暂停后继续走呢?那就得使用到next方法,next方法执行后会返回一个对象,对象中有value 和 done两个属性
value:暂停点后面接的值,也就是yield后面接的值done:是否generator函数已走完,没走完为false,走完为truefunction* gen() {yield 1;yield 2;yield 3;}const g = gen();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 }
generator函数和promise相结合
function pro(num) {return new Promise((resolve) => {resolve(num);});}function* gen() {yield pro(1);yield pro(2);yield pro(3);}
完整代码
export function genF(generatorFn) {const gen1 = generatorFn.apply(this);let g;let value;return new Promise((resolve) => {g = gen1.next();const aa = () => {g.value.then(() => {g = gen1.next();if (!g.done) {aa();value = g.value;} else {resolve(value);}});};aa();});}