调用所有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

