当前位置: 首页 > news >正文

ES6 Generator函数的异步应用 (八)

ES6 Generator 函数的异步应用主要通过与 Promise 配合使用来实现。这种模式被称为 “thunk” 模式,它允许你编写看起来是同步的异步代码。

特性:

  1. 暂停执行:当 Generator 函数遇到 yield 表达式时,它会暂停执行,等待 Promise 解决。
  2. 恢复执行:当 Promise 完成(解决或拒绝)时,Generator 函数恢复执行,并返回 yield 表达式的结果。
  3. 错误处理:可以对异步操作中的错误进行捕获和处理。
  4. 链式调用:可以创建一个链式的异步操作,每个操作都在前一个操作完成后开始。

1. 基本的异步 Generator 函数

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 语法糖

// 假设我们有以下 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}
})();

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));

4. 使用 yield* 委托给其他异步 Generator 函数

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);
http://www.lryc.cn/news/400034.html

相关文章:

  • Navicat:打造高效数据库管理之道
  • Python和C++全球导航卫星系统和机器人姿态触觉感知二分图算法
  • Unity 优化合集
  • 第九届MathorCup高校数学建模挑战赛-A题:基于数据驱动的城市轨道交通网络优化研究
  • Spring webflux基础核心技术
  • 关闭Ubuntu烦人的apport
  • 海事无人机解决方案
  • Docker--在linux安装软件
  • 知识库与RAG
  • 【2024最新】C++扫描线算法介绍+实战例题
  • 语言主要是一种交流工具,而不是思维工具?GPT5何去何从?
  • 传感器标定(三)激光雷达外参标定(lidar2ins)
  • 【漏洞复现】Crocus系统—Download 文件读取
  • 游戏开发面试题1
  • 线程池笔记
  • Go语言基础数据类型、变量及自增语法
  • ES6-ES13符号:单双引号、变量的解构赋值、占位符 、字符串模版`${} `、扩展运算符...、?,??,_,||=,=,in
  • 【远景能源25届校招PI测评】题型深度解析与应试策略
  • 关于Qt Creator 使用Qt Quick的Design模式设置
  • Spring常见问题一:IOC和DI
  • LabVIEW红外热波图像缺陷检
  • c#与欧姆龙PLC通信——如何更改PLC的IP地址
  • [Spring Boot]定时任务因系统时间修改之后无法执行
  • 【棋盘上的战舰】python刷题记录
  • NoSQL 之Redis集群
  • ES13的4个改革性新特性
  • Flutter EasyRefresh:介绍与使用指南
  • 链表的回文结构(链表的中间节点+反转链表)
  • 汇编学习基础知识【记录】
  • 【持续集成_06课_Jenkins高级pipeline应用】