推荐答案
async 函数的返回值始终是一个 Promise 对象。
- 如果 async 函数的返回值是非 Promise 值(例如数字、字符串、对象等),那么这个值会被
Promise.resolve()
包裹,生成一个新的 fulfilled 状态的 Promise,其 resolved 值就是该非 Promise 值。 - 如果 async 函数的返回值本身就是一个 Promise 对象,那么 async 函数返回的 Promise 的状态和结果将会与返回的 Promise 对象保持一致。
- 如果 async 函数中抛出了错误(使用
throw
语句),那么 async 函数返回的 Promise 将会处于 rejected 状态,拒绝原因为抛出的错误。
本题详细解读
async 函数的本质
async
关键字用于声明一个异步函数。它是一种更简洁、易于理解的方式来处理 Promise。async
函数内部可以使用 await
关键字,暂停函数的执行,直到 await
后面的 Promise resolved 或 rejected。
返回值规则详解
返回非 Promise 值:
async function example1() { return 10; } example1().then(value => console.log(value)); // 输出 10
在这个例子中,
example1
返回的是一个数字10
。由于example1
是一个async
函数,实际上它返回的是Promise.resolve(10)
,也就是一个状态为 fulfilled,值为10
的 Promise。then
方法会等待 Promise 变为 fulfilled 状态并获取其值。返回 Promise 对象:
async function example2() { return new Promise(resolve => { setTimeout(() => resolve("Hello"), 1000); }); } example2().then(value => console.log(value)); // 一秒后输出 "Hello"
在这个例子中,
example2
返回的是一个 Promise 对象。async
函数返回的 Promise 的状态和结果与返回的 Promise 对象一致。then
会等到内部 Promise resolve 后输出 "Hello"。抛出错误:
async function example3() { throw new Error("Something went wrong"); } example3().catch(error => console.log(error.message)); // 输出 "Something went wrong"
如果
async
函数内部抛出错误,则返回的 Promise 会变成 rejected 状态。我们可以使用catch
方法捕获错误,并输出错误信息。
总结
async
函数的本质是返回一个 Promise 对象,这使得它可以使用then
和catch
来处理异步操作。- 返回值会被 Promise 包装的特性,是
async
/await
语法能够以同步代码的风格来处理异步操作的关键。