异步解决方案 AsyncFunction 学习笔记。
webpack
未使用到的变量和函数,不会出现到编译后的文件里。(tree shaking)
Babel
关于
babel如何编译async函数的记录
只有@babel/preset-env
编译成功,会将async函数编译为Promise,但同时会报错regeneratorRuntime is undefined,
函数无法运行。
再含有@babel/plugin-transfrom-runtime
编译失败,会提示缺少@babel/runtime/helpers/asyncToGenerator和@babel/runtime/regenerator。
再含有@babel/runtime
此依赖需要安装为项目依赖。
1 | $ yarn add @babel/runtime |
编译成功,且函数运行成功。
@babel/polyfill的使用
安装
1 | $ yarn add @babel/polyfill |
全部引入
可以直接在项目入口导入,或者在webpack的entry中。
1 | // webpack.config.js |
非webpack全部引入
在js文件顶部使用require或者import引入
1 | // main.js |
配置.babelrc,将@babel/preset-nev的useBuiltIns字段设置为entry
1 | // .babelrc.js |
按需引入
无需引入@babel/polyfill,但仍需安装
1 | // .babelrc.js |
Async
async function声明用于定义一个返回
AsyncFunction对象的异步函数。
异步函数指通过事件循环异步执行的函数,它会通过一个隐式的
Promise返回其结果。
这个异步函数的语法和结构像是标准的同步函数。
async/await可用于简化多个promise异步调用的操作。
基础用法
1 | function resolveAfter2Seconds () { |
- 使用
async function声明来定义一个AsyncFunction。 - 使用
await关键字来处理异步函数,将会使此AsyncFunction暂停执行,等待Promise的结果出来,再恢复AsyncFunction的执行。 - AsyncFunction中使用
return关键字返回的值,会被隐式的Promise进行resolve。 - AsyncFunction中使用
throw关键字抛出的错误或者调用该函数时内部的错误,会被隐式的Promise进行reject。
await关键字只能在AsyncFunction内部使用,否则会报错
SyntaxError
Promise VS Async/Await
AsyncFunction改写Promise链
1 | function getProcessedData (url) { |
浏览器兼容性
- 非IE浏览器/QQ浏览器
- 其他高版本浏览器
需要babel来提供回退到 Promise + Promise Polyfill