async/await 是 Generator 和 Promise 的语法糖(async 取代 *
,await 取代 yield
)ES2017
语法
await
:
- 让 JavaScript 引擎等待直到 promise 完成(settled)并返回结果,它是 .then() 的更优雅写法
- 当函数执行的时候,一旦遇到 await 就会先返回,等到异步操作完成,再接着执行函数体内后面的语句
- 像 promise.then 那样,await 允许使用 thenable 对象(可调用 then 方法的对象)
- 如果 await 后面的 promise 最终 reject 了,那么等价于该行 throw 了一个错误
返回值
- 函数总是返回一个 promise,其他值将自动被包装在一个 resolved 的 promise 中
- 函数返回值会被 .then 方法的回调函数接收到,内部抛出的错误会被 .catch 方法的回调函数接收到
- await 后面跟 promise 返回值:
- 如果 promise 正常 resolve,返回的就是其 resolve 时传入的结果
- 如果 promise 被 reject,它将 throw reject 时传入的错误
- await 后面跟非 promise 返回值:
- 直接返回 resolved 的该值
顶层 awaitES2022
当处于一个 module 中时,那么在顶层可以直接使用 await(此时不需要 async)
错误处理
任何一个 await 语句后面的 Promise 对象变为 reject 状态,那么整个 async 函数都会中断执行,
如果不想中断,可以使用 try…catch 包住或者在 await 语句后面加 .catch
try…catch
.catch
注意,如果要将 await 的结果赋值给一个变量,则不能这么写: