在do/while循环中调用async异步函数如何等待结果返回后再继续执行?
问题根因
- 异步函数
getHandshakes默认返回Promise对象,你调用时没有加await关键字,无法拿到数据库返回的实际数据,对Promise对象解构得到的字段自然是undefined - do代码块内用
let声明的randomHandshake作用域仅局限在块内,while判断条件无法访问该变量,会导致逻辑判断异常 - 原判断条件中
message.data.previousTries.indexOf(recipientID) > 0存在逻辑漏洞:当匹配的ID在数组第一个位置(索引为0)时,判断会返回false,不符合「已在尝试列表中就继续循环」的预期逻辑 - 你之前尝试的
Promise.resolve写法逻辑错误:你传入的randomHandshake本身已经是undefined,封装成Promise后依然无法拿到正确的DB返回值
修正方案
你需要把整段逻辑包裹在async函数中,所有调用getHandshakes的位置都添加await关键字,等待异步结果返回后再执行后续逻辑,修正后的代码如下:
// 整段逻辑放在async函数内,Node.js 14.8+版本也可直接使用顶层await const handleHandshakeMatch = async (message) => { registerHandhsake(message.data.origID); let tries = 0; let recipientID; // 加await等待异步函数返回结果 const { activeHandshakes } = await getHandshakes(); do { // 加await获取DB返回的随机握手ID const { randomHandshake } = await getHandshakes(); recipientID = randomHandshake; console.log('checking', recipientID) tries++; } while ( tries < activeHandshakes && recipientID !== message.data.origID && // 修正数组存在性判断逻辑 message.data.previousTries.indexOf(recipientID) !== -1 ); // 后续处理recipientID的逻辑可以放在这里 } // 调用执行逻辑 handleHandshakeMatch(message)
await是异步函数的原生语法糖,会暂停当前函数的执行,直到Promise状态变为resolved拿到返回值后,才会继续执行后续代码,完全匹配你需要等待DB返回结果再往下执行的需求。
内容的提问来源于stack exchange,提问作者hernanl
相关产品推荐
相关产品推荐

