ES 6 系列之三种异步 - Async/await
介绍
async 函数时什么,其实就是 Generator 的语法糖,只需要将 * 改写成 async,yield 改写成 await。
我们来看看 Generator 的写法,与 async 的写法。
1 | const readFile = function (fileName, ms) { |
从上面我们可以看出,我们需要手动调用 next 方法,来执行下一步。
而 async 有自己内置执行器。
我们来看看 async 对 Generator 的改进。
- 内置执行器
Generator 函数执行需要next执行器,外面手动调用,所以有co模块,而 async 函数自带执行器,与普通函数一样,只需要一行调用。
下面代码中,调用了该函数之后,就会自动执行,输出最后结果。
1 | asyncTest(); |
语义更好
async/await,比起Generator函数的*与yield,语义更清晰。async就表示异步,而await表示后面的表达式需要等待结果。适用性更强
co模块约定,yield后面只能是Thunk函数或者Promise对象,而await后面可以是Promise,也可以是原始类型值。返回值是
Promiseasync函数返回值是Promise对象,可以用then方法来进行下一步操作。await命令就是内部then命令的语法糖。
用法
返回 Promise 对象
async函数返回一个Promise对象,可以使用then方法加入回调函数。- 执行函数时,遇到
await就会先返回,等异步操作结束,再继续执行函数体后面的语句。 - 必须等到内部所有
await命令后面的Promise对象执行完毕,状态才会改变,除非遇到return或者报错。 async函数内部的异步操作执行完毕,就可以执行then方法。JS没有休眠的语法,但是借助await命令就可以让程序停顿一定的时间。
1 | async function useAsync() { |
- 如果返回
reject状态,则会中断执行,并通过catch捕获
1 | async function useAsync() { |
await 命令
await 命令后面是一个 Promise 对象,返回结果。如果不是 Promise,就直接返回对应值。
await命令只能出现在async命令函数内部,不然会报错。
1 | const add = (a, b) => { |
await 后面跟着 add 方法,算出一个数值 3,然后将值 return 出来。
简单的 await 使用方法,就是如此。
相关文章推荐
-------------------- 本文结束
感谢阅读 --------------------