You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用所有async函数都必须使用await吗?

问题:async函数调用是否必须使用await?

我定义了如下JavaScript函数:

async isDataValid (externalValidation = true) {
    const isValid = (await this.v$.$validate()) && externalValidation
    // 其他与问题无关的代码
    return isValid
}

我知道要获取this.v$.$validate()的异步结果,必须把这个函数定义为async函数。因为isDataValid本身是async函数,我原本以为调用它时必须用await,但当我写了下面的代码:

const result = await this.isDataValid()

我的IDE弹出了警告:

Redundant 'await' for a non-promise type

这似乎说明IDE认为只有当async函数返回Promise时才需要用await,也就是因为isDataValid返回布尔值,所以不需要await。

那到底是所有async函数调用都需要用await,还是只对返回Promise的async函数用?

更新:我使用的是JavaScript,不是TypeScript。


解答

先明确核心规则:所有async函数的返回值都会被自动包装成Promise——不管你return的是布尔、字符串这类原始值,还是Promise对象,最终返回的都是一个Promise实例。

你写的isDataValid虽然return的是布尔值isValid,但因为它是async函数,实际返回的是Promise<boolean>,而非直接的布尔值。IDE弹出“冗余await”警告,本质是纯JS环境下的类型推断误判:它没正确识别出函数的Promise返回类型,误以为你在等待一个非Promise值。

回到你的问题:调用async函数**必须用await(或者用.then()链式调用)**才能拿到它的实际返回值。如果不用await,你得到的只是一个Promise对象,而非你return的布尔值,比如:

// 不用await的情况
const result = this.isDataValid()
console.log(result) // 输出:Promise {<pending>} 或已决议的Promise对象,不是布尔值

所以正确做法是保留await,IDE的警告属于误判,你可以直接忽略;也可以给函数加上JSDoc注释帮助IDE正确推断类型:

/**
 * 验证数据是否有效
 * @param {boolean} [externalValidation=true] - 是否开启外部验证
 * @returns {Promise<boolean>} 验证结果的Promise实例
 */
async isDataValid (externalValidation = true) {
    const isValid = (await this.v$.$validate()) && externalValidation
    // 其他与问题无关的代码
    return isValid
}

加上注释后,IDE就能正确识别返回类型,不会再弹出错误警告。

内容的提问来源于stack exchange,提问作者Antonio Dragos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:55:29