异步解决方案 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