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

yield 模拟 async/await

您说得对!Generator 的 yield 配合执行器确实可以模拟 await 的效果。让我用一个更直观的例子展示这种对应关系。

Generator 模拟 async/await

// 模拟异步函数
function delay(ms, value) {return new Promise(resolve => setTimeout(() => resolve(value), ms));
}// Generator函数(类似async函数)
function* asyncTask() {console.log('开始任务');const result1 = yield delay(1000, '第一步完成');console.log(result1);const result2 = yield delay(1500, '第二步完成');console.log(result2);return '任务完成';
}// 执行器(类似await的底层实现)
function runGenerator(genFn) {const iterator = genFn();function handle(result) {if (result.done) return Promise.resolve(result.value);return Promise.resolve(result.value).then(res => handle(iterator.next(res))).catch(err => iterator.throw(err));}return handle(iterator.next());
}// 执行Generator
runGenerator(asyncTask).then(finalResult => {console.log('最终结果:', finalResult);
});

与async/await的对应关系

Generator写法 async/await写法 说明
function* async function 声明异步函数
yield await 暂停执行等待Promise
runGenerator JavaScript引擎内置 自动执行器

转换为async/await版本


// 同样的异步函数
function delay(ms, value) {return new Promise(resolve => setTimeout(() => resolve(value), ms));
}// async/await版本
async function asyncTask() {console.log('开始任务');const result1 = await delay(1000, '第一步完成');console.log(result1);const result2 = await delay(1500, '第二步完成');console.log(result2);return '任务完成';
}// 直接调用
asyncTask().then(finalResult => {console.log('最终结果:', finalResult);
});

关键区别

  1. 语法糖

    • async/await是Generator+P执行器的语法糖
    • 不需要手动写执行器
  2. 错误处理

    // Generator版本
    function* task() {try {const res = yield asyncOp();} catch(err) {// 处理错误}
    }// async/await版本
    async function task() {try {const res = await asyncOp();} catch(err) {// 处理错误}
    }
    
  3. 返回值

    • Generator函数返回迭代器
    • async函数返回Promise

历史发展

  1. 回调地狱 → 2. Promise → 3. Generator → 4. async/await

Generator是JavaScript异步编程演进过程中的重要一步,它让开发者可以用同步的方式写异步代码,最终演变成了更简洁的async/await语法。

http://www.rkmt.cn/news/55361.html

相关文章:

  • 2025年工业凉水塔制造企业权威推荐榜单:水冷却塔/冷却塔冷水塔/方形冷却塔源头厂家精选
  • 2025年机场广告品牌口碑大比拼,前三名实力惊人!电梯视频广告/高铁广告/地铁广告/户外LED广告/户外农村墙体/主流网络媒体品牌有哪些
  • 高效构建 CHI 架构
  • 还在手动改数据库?Flyway 自动化迁移实战指南 - lxr
  • 毕业论文选题攻略:如何快速锁定高质量研究方向
  • SQL Server Job 操作
  • 2025年合金热喷涂加工厂权威推荐榜单:耐腐合金涂层工艺/合金涂层加工/合金涂层喷涂工厂服务商精选
  • 2025年成都火锅必吃榜TOP10,本地人强推!美食/地摊火锅/附近火锅/重庆火锅/牛肉火锅/成都火锅/老火锅/社区火锅/火锅品牌排行榜单
  • C#AI系列(1):深度学习项目构建及实战TensorFlow准备篇
  • 详细介绍:2026计算机毕业设计课题推荐
  • 基于SIC8F1233开发智能充气泵方案
  • B端界面设计之流程页设计——从“能用”到“好用”的边界重构
  • The 2025 ICPC Asia Shenyang Regional Contest
  • 2025一对一教育机构口碑排名:高性价比靠谱名单 + 权威测评排行榜
  • 11.19题解
  • 牛客刷题-Day23
  • 当 Git 账号密码输错后,凭证会被缓存下来怎么办?
  • 基于日志的邮件安全事件检测:从异常行为到攻击溯源
  • Playwright自动化测试框架与AI智能体应用公开课
  • 学习率调度器 (Learning Rate Scheduler)
  • 宏觀對沖的組合管理 Portfolio Management for Macro Hedging
  • dynamic_rnn转nn.GRU详细记录
  • 2025 最新推荐海外仓服务平台榜单:覆盖欧美东南亚等核心市场,美国 / 英国 / 德国 / 法国海外仓/换标 / 维修 / 检测优质服务商权威测评
  • Agent Dart证书验证漏洞深度解析
  • 2025年北京集团法律顾问服务权威推荐榜单:私人法律顾问/高级法律顾问/社区法律顾问服务精选
  • 2025年合肥外呼系哪家好--外呼系统推荐
  • 2025年四川搭建网站维护服务权威推荐:四川网站搭建平台/四川企业网站开发/四川企业官网搭建公司源头机构精选
  • 《浙商》杂志|协作方能共赢,湘湖论剑网易专场对接会描绘AI人机共生新蓝图
  • GESP C++ 二级真题 (2025.09) 知识点精讲
  • ESP32 C3使用ESP32-BLE-Keyboard的问题每次都要添加才能使用