내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
ES6 Generator 함수의 비동기 적용은 주로 Promise와 함께 사용하여 구현됩니다. 이 패턴을 "썽크" 패턴이라고 하며 이를 사용하면 동기적인 것처럼 보이는 비동기 코드를 작성할 수 있습니다.
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);
// 假设我们有以下 async generator
async function* asyncGen() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
// 我们可以使用 for...of 循环和 async...await 语法糖来简化调用
(async () => {
for await (let value of asyncGen()) {
console.log(value); // 依次输出 1, 2, 3
}
})();
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));
function* innerAsyncGen() {
yield Promise.resolve("A");
yield Promise.resolve("B");
}
function* outerAsyncGen() {
yield "Start";
yield* innerAsyncGen(); // 委托给另一个异步 Generator 函数
yield "End";
}
let outerGen = outerAsyncGen();
function runOuterGenerator(g) {
let result = g.next();
result.value.then(val => {
if (!result.done) {
runOuterGenerator(g);
}
});
}
runOuterGenerator(outerGen);