Async function为何不返回实际值而是返回promise?
问题成因解释
- ECMAScript 规范明确规定,所有
async函数的返回值都会被自动包装为 Promise 对象,无论函数内部 return 的是普通值、还是异步操作的结果,都会遵循这个规则:如果 return 普通值,会被包装为已兑现(fulfilled)状态的 Promise;如果函数内部抛出错误,会返回已拒绝(rejected)状态的 Promise。 - 你对
await的作用理解没有错:await会暂停当前 async 函数的执行,等待后方 Promise 兑现后,将兑现结果赋值给左侧变量,所以你在函数内部拿到的url确实是字符串类型。 - 外部调用 async 函数时,不会等待函数内部异步逻辑执行完成再返回结果:调用
getUrl()时,函数执行到await ngrok.connect(3000)就会暂时挂起,先将一个 pending 状态的 Promise 返回给调用方,等内部所有异步逻辑执行完毕、return 具体值之后,这个返回的 Promise 才会变为 fulfilled 状态,此时才能拿到最终的字符串类型 URL。
正确获取返回值的方式
如果要在外部拿到字符串类型的 URL,有两种常用实现方案:
- 用
then链式调用处理结果
getUrl().then(url => { // 此处的 url 为字符串类型,可以正常使用 console.log(url) })
- 在另一个 async 函数内用
await调用
async function main() { const url = await getUrl() // 此处的 url 为字符串类型 console.log(url) } main()
内容的提问来源于stack exchange,提问作者WasteofSpaceYT
相关产品推荐
相关产品推荐

