异步函数未等待Promise结果返回布尔值的问题排查
问题排查与修复方案
我一眼就定位到问题根源了——运算符优先级在这儿搞了个小动作!
问题出在哪?
你写的判断条件 if (await !this.vertexExists(entity)) 存在逻辑错误:!(逻辑非)的优先级比 await 更高,所以代码实际执行的顺序是:
- 先调用
this.vertexExists(entity)得到一个 Promise 对象 - 立刻对这个 Promise 对象取反(Promise 是真值,所以
!Promise结果为false) - 然后
await false(这一步毫无意义,直接得到false)
这就导致你的代码根本没等 vertexExists 里的异步操作完成,直接跳过了判断逻辑,自然不会等待 nbVertices 的返回结果。
修复方案
有两种简单的方式修正这个优先级问题:
方式1:先获取异步结果,再取反(可读性更高)
const entityExists = await this.vertexExists(entity); if (!entityExists) { const response = await this.gremlinQuery(query); return response.body.result.data; }
方式2:用括号强制改变运算顺序
if (!(await this.vertexExists(entity))) { const response = await this.gremlinQuery(query); return response.body.result.data; }
额外优化建议
你的 vertexExists 函数可以简化一下,不用多余的 if-else 判断,直接返回布尔表达式结果:
async vertexExists(properties) { const nbVertices = await this.countVertices(properties); return nbVertices !== 0; }
最后别忘了确认 countVertices 函数确实返回的是一个 Promise,只有这样 await 才能正确等待它的异步结果哦~
内容的提问来源于stack exchange,提问作者Baptiste Arnaud
相关产品推荐
相关产品推荐

