ES编译工具函数 __awaiter

3,701 阅读2分钟

前言

ES(ECMAScript)是一套脚本语言设计标准规范,使用它设计实现的语言有JavaScript,ActionScript等。

ES各版本特性一览

ECMA-262标准化官网

ES1-ES4

  • 传统特性

ES5 (2009)

  • 严格模式 strict mode
  • 属性访问器 Getter/Setter
  • JSON的静态方法 JSON.parse(), JSON.stringify()
  • Arrary 方法 isArray(), forEach(), map()等
  • Date.now()

ES2015 (ES6)

  • 变量声明let,常量const
  • class类
  • 箭头函数let func = ()=>{return}
  • 函数默认参数let func = (a = 1) => {return}
  • 模版字符串 `Hello${content}`
  • import/export
  • Promise
  • 展开运算符...
  • Arrary方法 find(), findIndex()
  • generator(生成器)

ES2016 (ES7)

  • 指数操作符 2**3 = 8
  • Arrary方法 includes() // 数组是否包含xxx

ES2017 (ES8)

  • 异步函数 async/await
  • 允许函数/对象尾逗号
  • 共享内存、原子对象
  • String方法 padStart(), padEnd()
  • Object方法 values(), entries(), getOwnPropertyDescriptors()

ES2018 (ES9)

  • 异步迭代
  • Rest/Spread 属性
  • 正则方法扩充

ES2019 (ES10)

  • Array方法flat, flatMap
  • Object方法fromEntries
  • 可选的catch参数

查询浏览器支持的ES标准

Can I use

正文

Generator(生成器)函数

Generator函数是ES6下新增的特性,用于异步编程。和普通函数不同的是,调用Generator函数后,函数并不会执行,而是返回一个指向内部状态的指针对象,也就是遍历器对象。

通过调用遍历器对象的next方法,内部指针就从函数头部或者上次停下的地方(yield)开始执行,直到遇到下一个yield表达式或return语句为止,并且会返回一个状态对象{value: "value", done: false},'value'就是生成器函数执行到yield语句之后得到的值,false表示还没有执行完,只是在这暂停。

生成器函数执行器函数

__awaiter:生成器函数执行器,为了解决es2017之前版本,支持async/await特性,通过generate函数、遍历器、yield、Promise来实现

// 原有的async函数会被转换为generator函数,ES2017后支持原生的async/await
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    // 生成器函数包裹为Promise 
    return new (P || (P = Promise))(function (resolve, reject) {
        /* 满足函数,用来递归的执行遍历器的下一个结果 */
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        /* 拒绝函数,用来使遍历器抛出异常 */
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        /* 处理遍历器的下一个结果,即next结果
        如果状态为done直接resolve 
        如果状态不是done,返回新的Promise,通过fulfilled函数再次获取遍历器的下一个next值*/
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        /* 获取生成器函数的遍历器 */
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};