Uniapp当中的async/await的作用

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

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,代码会变成:

const getUserMessagePlan = () => {// 直接获取 Promise 对象(未等待结果)const tabsList = message.getTagesList();        // 返回未完成的 Promiseconst tagsStateList = message.getTagsStateList(); // 同上// 此时 tabsList 和 tagsStateList 是 Promise 对象,而非实际数据const tempMessageList = [];for (let i = tabsList.length - 1; i >= 0; i--) { // ❌ 报错:tabsList 是 Promise,无 lengthconst user = message.getUserInfo(tabsList[i].senderId); // 同样返回 Promiseconst 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(推荐)

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

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

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

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),但不可省略异步控制关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式 Day 5:夯实观察者模式(Boost 实战精讲)

今天我们继续深入观察者模式的学习,不再局限于手写的抽象结构,而是聚焦于真实项目中如何使用成熟框架(如 Boost.Signals2)高效落地观察者模式。 本篇采用**“理论解析 问答讲解 实战用例”**结构,帮助你从设计思想到…

设计模式 Day 3:抽象工厂模式(Abstract Factory Pattern)详解

经过前两天的学习,我们已经掌握了单例模式与工厂方法模式,理解了如何控制实例个数与如何通过子类封装对象的创建逻辑。 今天,我们将进一步深入“工厂”体系,学习抽象工厂模式(Abstract Factory Pattern)&a…

MySQL:事务的理解

一、CURD不加控制,会有什么问题 (1)因为,MySQL里面存的是数据,所以很有可能会被多个客户访问,所以mysqld可能一次会接受到多个关于CURD的请求。(2)且mysql内部是采用多线程来完成数…

蓝桥杯刷题--宝石组合

在一个神秘的森林里,住着一个小精灵名叫小蓝。有一天,他偶然发现了一个隐藏在树洞里的宝藏,里面装满了闪烁着美丽光芒的宝石。这些宝石都有着不同的颜色和形状,但最引人注目的是它们各自独特的 “闪亮度” 属性。每颗宝石都有一个…

DAY06:【pytorch】图像增强

1、基本概念 数据增强,又称数据增广、数据扩增,是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力 2、裁剪 — — Crop 2.1 transforms.CenterCrop 功能:从图像中心裁剪图片 size:所需裁剪图…

mysql 禁止 读 某个 表

mysql 禁止 读 某个 表 mysql禁用某张表,禁用MySQL表的操作 https://shuyeidc.com/wp/89479.html MySQL严格禁止读取表如何避免数据泄露 https://www.kdun.cn/ask/394700.html select host,user from mysql.user; FLUSH PRIVILEGES; 1. MySQL严格禁止读取表如何避免数据泄露…

机器学习 从入门到精通 day_03

1. KNN算法-分类 1.1 样本距离判断 明可夫斯基距离:欧式距离,明可夫斯基距离的特殊情况;曼哈顿距离,明可夫斯基距离的特殊情况。 两个样本的距离公式可以通过如下公式进行计算,又称为欧式距离。 (…

LeetCode 热题 100_零钱兑换(85_322_中等_C++)(动态规划)

LeetCode 热题 100_零钱兑换(85_322) 题目描述:输入输出样例:题解:解题思路:思路一(动态规划): 代码实现代码实现(思路一(动态规划)&a…

游戏盾IP可以被破解吗

游戏盾IP(如上海云盾SDK、腾讯云游戏盾)是专为游戏行业设计的高防服务,旨在抵御DDoS攻击、CC攻击等威胁。其安全性取决于​​技术架构、防护能力​​以及​​运维策略​​。虽然理论上没有绝对“无法破解”的系统,但游戏盾IP在合理…

SpringBoot实战1

SpringBoot实战1 一、开发环境,环境搭建-----创建项目 通过传统的Maven工程进行创建SpringBoot项目 (1)导入SpringBoot项目开发所需要的依赖 一个父依赖:(工件ID为:spring-boot-starter-parent&#xf…

【软考-高级】【信息系统项目管理师】【论文基础】进度管理过程输入输出及工具技术的使用方法

定义 项目进度管理是为了保证项目按时完成,对项目中所需的各个过程进行管理的过程,包括规划进度、定义活动、活动优先级排序、活动持续时间、制定进度计划和控制进度。 管理基础 制定进度计划的一般步骤 选择进度计划方法(如关键路径法&a…

【Linux】之【Get】 chroot 环境下安装deb包时 .postinst:行 9: 201 段错误 (核心已转储)ldconfig

背景 如题,在postinst文件中直接执行了ldconfig命令, chroot 环境下出错,安装失败 分析 chroot 环境下不能用 ldconfig 和 systemctl 但是:如果环境是 chroot,系统有可能没完整挂载 /proc、/dev、系统路径&#xff…

【论文精读与实现】EDC²-RAG:基于动态聚类的文档压缩方法提升检索增强生成RAG性能

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 1. 论文核心思想 这篇由清华大学团队提出的EDC-RAG框架,针对当前…

OSPF接口的网络类型和不规则区域

网络类型(数据链路层所使用的协议所构建的二层网络类型) 1、MA --- 多点接入网络 BMA --- 支持广播的多点接入网络 NBMA --- 不支持广播的多点接入网络 2、P2P --- 点到点网络 以太网 --- 以太网最主要的特点是需要基于MAC地址进行物理寻址,主要是因为以太网接口所连…

HTTP代理:内容分发战场上的「隐形指挥官」

目录 一、技术本质:流量博弈中的「规则改写者」 二、战略价值:内容分发的「四维升级」 三、实战案例:代理技术的「降维打击」 四、未来进化:代理技术的「认知升级」 五、结语:代理技术的「战略觉醒」 在数字内容爆…

(2)网络学习之堡垒机

堡垒机和防火墙的区别: 1.功能定位 防火墙主要负责抵御外部攻击,就像一道坚固的城墙,防止黑客进入内部网络。堡垒机则专注于内部管理,监控和记录运维人员的操作行为,确保内部网络的安全。 2.部署位置与作用范围 防…

minio命令行客户端mc常见用法

安装minio命令行客户端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安装minio命令行客户端 choco install minio-client -y# Linux安装mc客户端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 赋予可…

idea调整控制台日志显示长度

概述 在调试时,idea控制台显示的日志有长度显示,当显示的日志太长时,后生成的日志会覆盖掉之前生成的日志内容。想要调整长度就可以按以下方式进行设置。 设置方法 Settings -> Editor -> General -> Console -> Override con…

oracle em修复之路

很早以前写的文章,再草稿中存放太久了,今天开始整理20年来工作体会,以后陆续发出,希望给大家提供小小的帮助。 去年做的项目使用的oracle数据库,最近要看一下,启动机器进入系统,出现无法加载数…

QT中怎么隐藏或显示最大化、最小化、关闭按钮

文章目录 方法一:通过代码动态设置1、隐藏最大化按钮2、隐藏最小化按钮3、隐藏关闭按钮方法 1:移除 WindowCloseButtonHint方法 2:使用 Qt::CustomizeWindowHint 并手动控制按钮 4、同时隐藏最大化和最小化按钮5、同时隐藏最大化和关闭按钮6、…