Uniapp当中的async/await的作用

一、原始代码的行为(使用 async/await

javascript 复制代码
const getUserMessagePlan = async () => {
  // 等待两个异步操作完成
  const tabsList = await message.getTagesList();        // 等待获取标签列表
  const tagsStateList = await message.getTagsStateList(); // 等待获取状态列表

  // 后续代码在数据就绪后执行
  const tempMessageList = [];
  for (let i = tabsList.length - 1; i >= 0; i--) {
    const user = await message.getUserInfo(tabsList[i].senderId); // 等待获取用户信息
    // 构造数据对象
    const t = { ... };
    tempMessageList.push(t);
  }
  userMessageList.value = sortData(tempMessageList);
};

关键特性

await 会暂停当前函数的执行,直到 Promise 完成,并按顺序解析结果。

• 所有异步操作(如网络请求)会按代码顺序依次执行,确保数据就绪后才进行后续处理。


二、删除 async/await 的后果

若直接删除 async/await,代码会变成:

javascript 复制代码
const getUserMessagePlan = () => {
  // 直接获取 Promise 对象(未等待结果)
  const tabsList = message.getTagesList();        // 返回未完成的 Promise
  const tagsStateList = message.getTagsStateList(); // 同上

  // 此时 tabsList 和 tagsStateList 是 Promise 对象,而非实际数据
  const tempMessageList = [];
  for (let i = tabsList.length - 1; i >= 0; i--) { // ❌ 报错:tabsList 是 Promise,无 length
    const user = message.getUserInfo(tabsList[i].senderId); // 同样返回 Promise
    const t = { ... }; // 此时 user 是未完成的 Promise,数据无效
    tempMessageList.push(t); // 填充无效数据
  }
  userMessageList.value = sortData(tempMessageList); // 数据混乱
};

具体问题

  1. Promise 未被解析tabsListtagsStateList 会直接返回 Promise 对象,而非实际数据。
  2. 循环逻辑崩溃 :尝试访问 tabsList.length 时会报错,因为 tabsList 是 Promise(没有 length 属性)。
  3. 数据无效message.getUserInfo 返回的 Promise 未被等待,user 变量将是一个未完成的 Promise,无法获取 uidavatar 等字段。
  4. 最终结果错误tempMessageList 中填充的是 Promise 对象,而非真实数据,导致渲染或后续处理失败。

三、如何正确优化?

方案一:保留 async/await(推荐)

保持原有逻辑,确保异步操作按顺序执行:

javascript 复制代码
const getUserMessagePlan = async () => {
  const [tabsList, tagsStateList] = await Promise.all([
    message.getTagesList(),
    message.getTagsStateList()
  ]);
  // 并行请求优化(减少总耗时)
  // ...
};
方案二:改用 Promise.then() 链式调用

若不使用 async/await,需手动处理 Promise 链:

javascript 复制代码
const getUserMessagePlan = () => {
  message.getTagesList()
    .then(tabsList => message.getTagsStateList().then(tagsStateList => {
      const tempMessageList = [];
      const promises = tabsList.map((tab, i) => 
        message.getUserInfo(tab.senderId).then(user => ({
          uid: user.uid,
          // ...
        }))
      );
      return Promise.all(promises);
    }))
    .then(tempMessageList => {
      userMessageList.value = sortData(tempMessageList);
    });
};

缺点:代码嵌套复杂,可读性差。


四、总结

必须使用异步控制async/awaitPromise.then() 是处理异步操作的唯一可靠方式。

删除 async/await 的后果 :数据未就绪时执行后续代码,导致逻辑错误和渲染异常。

优化建议 :若需提升性能,可并行请求(如 Promise.all),但不可省略异步控制关键字。

相关推荐
dy171724 分钟前
element-plus表格默认展开有子的数据
前端·javascript·vue.js
2501_915918414 小时前
Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析
前端·低代码·ios·小程序·uni-app·编辑器·iphone
2501_915106324 小时前
iOS 使用记录和能耗监控实战,如何查看电池电量消耗、App 使用时长与性能数据(uni-app 开发调试必备指南)
android·ios·小程序·uni-app·cocoa·iphone·webview
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
索迪迈科技5 小时前
网络请求库——Axios库深度解析
前端·网络·vue.js·北京百思可瑞教育·百思可瑞教育
gnip5 小时前
JavaScript二叉树相关概念
前端
一朵梨花压海棠go6 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
attitude.x6 小时前
PyTorch 动态图的灵活性与实用技巧
前端·人工智能·深度学习
β添砖java6 小时前
CSS3核心技术
前端·css·css3
空山新雨(大队长)6 小时前
HTML第八课:HTML4和HTML5的区别
前端·html·html5