You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动