參考: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();});}