基础概念
JavaScript 是单线程的,为了处理异步操作,先是使用回调函数,接着使用 Promise,然后又使用 generator/yield,最后到本文要介绍的 async/await。
引用阮一峰大大的一句话 async 函数就是 generator 函数的语法糖。
首先看一个结合 Promise 和 generator 处理异步的例子:
1 | var fs = require('fs') |
通过这个例子,大家也看出来了,用 generator 函数处理异步的麻烦之处在于,它还需要自己定义执行器。
接下来用 async 函数改写这个例子。
1 | var fs = require('fs') |
一比较就会发现,async
函数就是将 generator 函数的星号(*)替换成 async
,将 yield
替换成 await
。而且 async
函数不需要自己定义执行器!
注意事项
- 区别于生成器的定义,可以使用箭头函数定义
async
。 - 与
yield
一样,await
只能用在async
函数内部,用于其他任意位置都是语法错误,即使在async
函数内部的函数中也不行。 async
函数返回的是Promise
实例。- 如果
async
函数内抛出了错误,并且没有被try...catch
包裹,async
会直接以该错误作为原因,返回一个状态为 rejected 的Promise
实例。 - 如果
await
后面是一个非Promise
非 thenable 的值,则直接返回。 - 如果
await
后面是一个Promise
实例。
6.1 当Promise
实例被 fulfill 时,返回Promise
实例的值。
6.2 当Promise
实例被 reject 时,则将Promise
被 reject 的值作为错误在此处抛出(同 4)。 - 如果
await
后面是一个 thenable 对象,会现将其作为Promise
实例进行处理(同 6)。
1 | const asyncFun = async () => { |
1 | const asyncFun = async () => { |
1 | const asyncFun = async () => { |