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

网站建设站点免费外链发布平台在线

网站建设站点,免费外链发布平台在线,做网站哪种字体好看,宝鸡市交通运输局公路建设网站一、为什么 Babel 要编译成 Generator? 老版本浏览器不支持 async/await,所以 Babel 会: async function fn() { // 定义一个异步函数 fn,使用 async 关键字表明函数内部可以使用 awaitconst res await g…

一、为什么 Babel 要编译成 Generator?

老版本浏览器不支持 async/await,所以 Babel 会:

async function fn() {                      // 定义一个异步函数 fn,使用 async 关键字表明函数内部可以使用 awaitconst res = await getData();            // 调用异步函数 getData(),等待其执行完成后,将返回值赋给 res 变量return res + 1;                         // 返回 res 加 1 的结果;这个 return 的结果会自动被封装成一个 Promise 对象
}

编译成:

var fn = _asyncToGenerator(                    // 调用 _asyncToGenerator 把一个 Generator 函数转成支持 Promise 的 async 函数regeneratorRuntime.mark(function* _callee() { // 使用 regeneratorRuntime.mark 包装一个 Generator 函数,生成器函数名为 _calleevar res;                                   // 定义变量 res,用于存放 getData 的返回结果return regeneratorRuntime.wrap(function (_context) { // 包装内部状态控制逻辑(状态机),_context 管理执行流程while (1) switch (_context.prev = _context.next) { // 状态机循环,通过 switch 和 _context 控制流程跳转case 0:                                 // case 0:初始状态_context.next = 2;                    // 跳转到状态 2,并执行 yield 表达式(实际是 await)return getData();                     // yield getData(),此处暂停,等待 Promise 返回(相当于 await getData())case 2:                                 // case 2:getData 执行完成,结果通过 _context.sent 获取res = _context.sent;                  // 把 yield 表达式(即 getData())的返回值赋给 res_context.abrupt("return", res + 1);   // 立即中断函数并返回 res + 1,相当于 return res + 1}}, _callee);                                // 绑定到 _callee 生成器函数上})
);

二、结构总览(模块分解)

编译后核心结构包括这几个部分:

名称解释
_asyncToGenerator()把 Generator 包装成异步 Promise
regeneratorRuntime.mark(fn)把函数标记为 Generator
regeneratorRuntime.wrap(fn)把函数包裹成状态机控制结构
while (1) switch(...)状态切换结构
_context.next跳转到下一个状态
_context.sent获取上一个 yield/await 的返回值
_context.abrupt()立即返回或退出当前状态

三、状态机结构详解

源码:

async function test() {const a = await getData();const b = await parseData(a);return b;
}

编译后:

var test = _asyncToGenerator(                // _asyncToGenerator:将生成器函数转换为返回 Promise 的函数(兼容 async)regeneratorRuntime.mark(function* () {     // regeneratorRuntime.mark:将匿名 Generator 函数进行注册和标记var a, b;                                // 定义两个变量 a 和 b,用来存储异步操作的结果return regeneratorRuntime.wrap(function (_context) { // 包装状态机,_context 是内部上下文控制器while (1) switch (_context.prev = _context.next) { // 无限循环 + 状态切换机制(状态机)case 0:                              // 初始状态 case 0_context.next = 2;                 // 设置下一步跳转到 case 2,同时 yield 一个异步操作return getData();                  // yield getData(),相当于 await getData(),暂停执行等待结果case 2:                              // 等 getData() Promise resolve 后,跳转到这里a = _context.sent;                 // 获取 getData() 的结果,赋值给变量 a_context.next = 5;                 // 设置下一步为 case 5return parseData(a);               // yield parseData(a),等价于 await parseData(a)case 5:                              // 等 parseData() 执行完后跳到这里b = _context.sent;                 // 获取 parseData(a) 的结果,赋值给变量 b_context.abrupt("return", b);      // 立即中断并返回 b,等价于 return b}});})
);

四、状态转移图解

状态是通过 switch (_context.prev = _context.next) 控制的:

状态 0 → _context.next = 2return getData();          // await getData()状态 2 → a = _context.sent_context.next = 5return parseData(a);   // await parseData(a)状态 5 → b = _context.sentreturn b;              // return 结果

每个 case 就是一个逻辑步骤。每次 return 表示 await每次 sent 是拿返回值


五、关键语句详解

语句作用等价于原始 JS
_context.next = N; return foo();执行 foo,并跳转到第 N 步await foo();
res = _context.sent;拿到上一步 yield 的结果const res = await xxx;
_context.abrupt("return", xxx);提前退出函数,返回值为 xxxreturn xxx;

六、执行流程详解(配图思维)

async function fn() {const res = await getData(); // Step 1await saveData(res);         // Step 2return "done";               // Step 3
}

变成:

switch (_context.prev = _context.next) {       // 状态机入口,切换执行状态case 0:                                       // 第 0 步,初始状态_context.next = 2;                          // 指定下一步为 case 2return getData();                           // step 1:执行 getData(),暂停函数等待 Promise 结果(相当于 await getData())case 2:                                       // 第 2 步,getData() 执行完,继续执行res = _context.sent;                        // 获取 getData() 的结果,赋值给 res(相当于 const res = await getData())_context.next = 5;                          // 指定下一步为 case 5return saveData(res);                       // step 2:执行 saveData(res),暂停函数等待 Promise 结果(相当于 await saveData(res))case 5:                                       // 第 5 步,saveData(res) 执行完,继续执行_context.abrupt("return", "done");          // step 3:返回 "done",终止 Generator(相当于 return "done")
}

每一步是状态跳转 + 执行 + 下一步


七、如何手动还原 async/await?

只需 3 步

  • _context.next = N; return xxx → 就是 await xxx

  • xxx = _context.sent; → 表示上一步结果赋值

  • _context.abrupt("return", ...) → 函数的 return


八、技巧总结

实战分析点如何应对
_context.sent找到结果变量,理解 await 获取值
_context.next理解跳转执行顺序
abrupt("return")确定退出函数并返回值
多层嵌套 Generator拆解并逐步打印每层函数
http://www.dtcms.com/wzjs/372918.html

相关文章:

  • 西安做网站多少钱微信seo
  • 模板做的网站如何下载免费推广平台排行
  • wordpress会员下载插件淘宝怎么优化关键词步骤
  • 珠海网站建设小程序社交网络推广方法有哪些
  • 学广告设计要学什么软件求好用的seo软件
  • 雅安网站制作百家号查询排名数据查询
  • 专门做网站建设的公司自己如何注册网站
  • 自己制作的网站天津做网站的
  • 给期货交易类做网站违法吗九江seo
  • 设计建网站广西壮族自治区
  • .电子商务网站的开发原则包括百度竞价广告怎么投放
  • 做网站维护需要什么证书新东方在线网上课程
  • 网站建设后怎么手机制作网页用什么软件
  • 电子商务网站建设与管理教材评价东莞网站建设优化排名
  • 网站建设地基本流程搜索引擎排名google
  • 手机网站模板源码下载今天有哪些新闻
  • 杭州城市建设网站政府免费培训面点班
  • wordpress建站速度提升常德seo招聘
  • 台州做网站最好的巢湖网站制作
  • 广东网站建设专业公司无锡网站制作推广
  • 评网网站建设什么是搜索推广
  • 网站页面链接怎么做免费自助建站平台
  • 怎么用源码搭建网站网络营销软件
  • 镇江网站建设费用网站运营工作的基本内容
  • 做海报文案的参考网站qq群排名优化
  • 网站怎么做备案号超链接手机百度app安装下载
  • 蛋糕网站模板山东公司网站推广优化
  • 网站设计要求 优帮云互联网全媒体广告代理
  • 黄岛网站建设哪家专业淘宝网店运营
  • 苏州市市政建设管理处网站软文广告是什么意思