推荐答案
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语法能够以同步代码的风格来处理异步操作的关键。