共计 775 个字符,预计需要花费 2 分钟才能阅读完成。
Generator 函数与 async 函数对比
Generator 函数:
Generator 函数是 ES2015 提供的异步解决方案,与普通函数有很大的不同;
特征:
在 function 关键字后面跟一个 (*) 号;
在函数体内部使用 yield 表达式作为一个状态;
Generator 函数返回一个遍历器,可通过 for……of 方法遍历每个状态;
用法:
执行 Generator 并不立刻执行,返回一个遍历器,遍历器通过调用 next()、throw()或者 return()执行下一个状态、捕获错误或者结束遍历器;
async 函数:
async 函数是 ES2017 提供的异步函数语法,是 generator 的语法糖,但是用法上与 Generator 函数还是有很大不同;
特征:
在 function 关键字前面跟一个 async 关键字;
在函数体内部使用 await 表达式;
async 函数返回一个 promise 对象;
用法:
执行 async 函数会立刻执行,和普通函数一样,但是返回一个 promise 对象;
两者对比:
Generator 出现在 ES2015 中,async 出现在 ES2017 中,async 是 Generator 的语法糖;
执行方式不同,Generator 执行需要使用执行器(next()等方法);async 函数自带执行器,与普通函数的执行一样;
async 的语法语义更加清楚,async 表示异步,await 表示等待;而 Generator 函数的 (*) 号和 yield 的语义就没那么直接了;
Generator 中 yield 后面只能跟 Thunk 函数或 Promise 对象;而 async 函数中 await 后面可以是 promise 对象或者原始类型的值(会自动转为立即 resovle 的 promise 对象);
返回值不同,Generator 返回遍历器,相比于 async 返回 promise 对象操作更加麻烦。
参考:
ECMAScript 6 入门