c 做網(wǎng)站怎么顯示歌詞百度推廣有哪些推廣方式
ES6 Generator 函數(shù)的異步應(yīng)用主要通過與 Promise 配合使用來實(shí)現(xiàn)。這種模式被稱為 “thunk” 模式,它允許你編寫看起來是同步的異步代碼。
特性:
- 暫停執(zhí)行:當(dāng) Generator 函數(shù)遇到 yield 表達(dá)式時(shí),它會暫停執(zhí)行,等待 Promise 解決。
- 恢復(fù)執(zhí)行:當(dāng) Promise 完成(解決或拒絕)時(shí),Generator 函數(shù)恢復(fù)執(zhí)行,并返回 yield 表達(dá)式的結(jié)果。
- 錯(cuò)誤處理:可以對異步操作中的錯(cuò)誤進(jìn)行捕獲和處理。
- 鏈?zhǔn)秸{(diào)用:可以創(chuàng)建一個(gè)鏈?zhǔn)降漠惒讲僮?#xff0c;每個(gè)操作都在前一個(gè)操作完成后開始。
1. 基本的異步 Generator 函數(shù)
function delay(time) {return new Promise(resolve => setTimeout(resolve, time));
}function* asyncGenerator() {console.log("Start");yield delay(1000); // 等待1秒console.log("After 1 second");yield delay(1000); // 再等待1秒console.log("After another second");return "Done";
}let gen = asyncGenerator();function runGenerator(g) {let result = g.next();result.value.then(() => {if (!result.done) {runGenerator(g);}});
}runGenerator(gen);
2. 使用 for…of 和 async…await 語法糖
// 假設(shè)我們有以下 async generator
async function* asyncGen() {yield await Promise.resolve(1);yield await Promise.resolve(2);yield await Promise.resolve(3);
}// 我們可以使用 for...of 循環(huán)和 async...await 語法糖來簡化調(diào)用
(async () => {for await (let value of asyncGen()) {console.log(value); // 依次輸出 1, 2, 3}
})();
3. 處理異步操作中的錯(cuò)誤
function* asyncGenWithError() {try {yield Promise.reject("Error occurred!");} catch (e) {console.log(e); // 輸出:Error occurred!}
}let genWithError = asyncGenWithError();genWithError.next().value.catch(err => console.log(err));
4. 使用 yield* 委托給其他異步 Generator 函數(shù)
function* innerAsyncGen() {yield Promise.resolve("A");yield Promise.resolve("B");
}function* outerAsyncGen() {yield "Start";yield* innerAsyncGen(); // 委托給另一個(gè)異步 Generator 函數(shù)yield "End";
}let outerGen = outerAsyncGen();function runOuterGenerator(g) {let result = g.next();result.value.then(val => {if (!result.done) {runOuterGenerator(g);}});
}runOuterGenerator(outerGen);