Async/Await异步流程异常:发送SMS函数未等待返回响应求助
问题分析与修复方案
我看了你的代码,核心问题是异步操作没有被正确等待,而且你混合使用了async/await、.then()和回调函数,导致Promise链断裂,程序没有按预期的「搜索→插入→发送短信→继续搜索」顺序执行,而是先跑完所有搜索,再批量处理短信发送。咱们一步步来修复:
主要问题点拆解
- 调用
async函数时没有用await,导致函数被当作独立Promise执行,主线程不等待其完成 - 混用
async/await和.then(),破坏了异步流程的连续性 sendSMS中同时使用Promise和回调函数,回调里的return无法作用于外层的Promise返回
逐步修复代码
1. 修复最外层的查询与遍历逻辑
原来的t.any(Query).then()里调用getQualifiedUsers()时没有await,而且没有返回这个Promise,导致主线程直接继续。改成用async函数配合await:
// 把外层的.then()换成async逻辑,用await替代 const response = await t.any(Query); const getQualifiedUsers = async () => { try { // 补充遍历用户的逻辑(原代码未明确,需替换为你的实际遍历逻辑) for (const user of response) { if ("meets criteria") { // 替换为你的实际条件判断 try { await insertInTable(); // 等待插入操作完成再继续 } catch (error) { console.log("插入数据表失败:", error); } } } } catch (error) { console.log("遍历用户列表失败:", error); } }; await getQualifiedUsers(); // 必须await,确保整个遍历流程完成后再继续
2. 修复insertInTable函数
原函数里混用了await和.then(),而且内部的sendAsyncSMS()没有被等待。直接简化成用await处理数据库操作,然后直接等待短信发送:
async function insertInTable() { try { const numberSaved = await db.any(secondQuery); // 用await替代.then(),获取数据库返回结果 await sendSMS(); // 等待当前短信发送完成,再处理下一个用户 } catch (error) { console.log("插入或短信发送失败:", error); } }
3. 修复sendSMS函数
client.messages.create本身返回Promise,不需要额外加回调函数,直接用await获取结果,避免回调和Promise混用:
async function sendSMS() { const date = moment().utc().format('MM-DD-YYYY HH:mm:ss'); console.log('date', date); try { const message = await client.messages.create(params); // 直接await Promise获取结果 console.log(message.sid); return 'done'; // 这里的return会被外层的await捕获 } catch (err) { console.log("短信发送失败:", err); return 'done'; // 出错也返回统一标识,可根据需求调整 } }
关键注意事项
- 只要是
async函数,调用时一定要用await或者.then()处理,否则异步操作会“脱离”主线程,不被等待 - 尽量统一使用
async/await,避免同时混用.then()和回调函数,这样代码更易读,也不容易出现流程断裂的问题 - 错误处理要分层,尽量在每个异步操作的
try/catch里明确捕获错误,方便定位问题
内容的提问来源于stack exchange,提问作者MCM13




