ES6 async

发布时间 2023-11-29 18:09:13作者: 我是小凳子

async

async 函数总返回的是一个 Promise 对象(不论是否有 return 语句)。

  • async 函数内部的 return 语句返回的值,作为 then() 回调函数的参数。

  • async 函数内部抛出的错误,返回的 Promise 对象变为 reject 状态,错误会被 catch 捕获到。

  • 只有 async 函数内部的异步操作执行完,才会执行 then 指定的回调函数。

await 只能用在 async 函数中,用在普通函数中会报错

通常情况下,await 后边是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,直接返回对应的值。

await 后边是一个 thenable 对象(定义了 then 方法的对象),那么 await 会将其等同于 Promise 对象。

await 后边的 Promise 状态是 reject , 则 reject 的参数会作为 catch() 的回调函数的参数(即使是没有使用 return 返回 Promise)。

async function f() {
  // return await new Promise((resolve, reject) => resolve(1)) // res: 1(若没有使用 return 语句返回,输出结果是 res: undefined)
  await new Promise((resolve, reject) => reject('出错啦')) // err: 出错啦(即使没有使用 return 语句,错误也会被 catch 捕获到)
}
f().then(res => console.log("res:", res)).catch(err => console.log("err:", err))
  • await 后边异步操作出错, 等同于 async 函数返回的 Promise 对象状态是 reject

顶层 await

允许在模块的顶层独立使用 await 命令,主要目的是使用 await 解决模块异步加载的问题。

顶层 await 只能用在 ES6 模块,不能用在 CommonJS 模块。这是因为 CommonJS 模块的 require() 是同步加载,如果有顶层 await ,就没法处理加载了。

// import() 方法加载
const strings = await import(``);

如果加载多个包含顶层 await 命令的模块,加载命令是同步执行的。