async 和 await的使用
一、需求
点击按钮处理重复提交,想要通过disabled的方式实现。
但是点击按钮调用的方法里有ajax、跳转、弹窗等一系列逻辑操作,需要等方法里流程都走完,再把disabled设为false,这样下次点击按钮时就可以继续走方法里的ajax等操作。
ajax请求需要时间返回,需要等返回后才能把disabled设为false,这就要保证点击按钮里的方法是同步执行的;
ajax.then.then的实现方法嵌套的太多,可以使用async 和 await代替,async是异步的,需要靠 await达到同步效果。
二、实现
addPaper里的所有操作,不管层级如何,每个都要使用async 和 await,保证代码都是同步执行的;
不是同步执行的话,ajax还没返回,就执行了下面的disabled=false,重复提交时拦截不住的。
保证了代码是同步执行的,就可以在addPaper.then里一个位置将disabled=false,不用在addPaper里每个位置都设置addPaper。
Builder.init({disabled:false //初始定义disabled为false,点击按钮时,可以继续执行方法里的操作
})
.method("onItemClick",function(e){// disabled=true,表示已经点击此按钮,并且此方法并未执行完成,直接return先不继续执行if(this.data.disabled){return false;}this.data.disabled = true //disabled=true,保证下次点击时拦截继续执行this.addPaper({jobid:item.JobId,dimensionid:'',interviewtype:1,checkexistinterview:1}).then(function(result){// addPaper里使用async和await,保证方法都是同步执行的,这里then方法里将disabled=false,表示点击按钮可以继续执行了that.data.disabled = false})
}) .method("addPaper",async function(args){let that = thisawait checkSession.getAppSession().then(async function(sessionKey){if(!util.session.signKey){await wx.navigateTo({url: '/pages/login/login?curjobid='+args.jobid+'&interviewtype='+args.interviewtype+'&dimensionid='+args.dimensionid,success:(e)=>{that.data.disabled = false},});}else{await that.toAddPaper(args)}})})builder.method("toAddPaper", async function (args) {let that = this;await http.promiseRequest({url: "/aivideo/addTempPaper",method: "POST",data: {},}).then(async (result)=>{});
})
延伸:
ajax是比较友好的一种方式,ajax通过async 和 await是可以实现同步的,addPaper里有wx.navigateTo跳转、微信wx.authorize授权摄像头、wxModel弹窗等时,就需要在addPaper内部在每一个位置添加disabled=false。
1、wx.navigateTo在跳转succes里添加disabled=false
2、wxModel弹窗,因为弹窗出来流程就走完了,直接弹窗位置加上disabled=false即可。
3、wx.authorize,就直接弹出来授权窗口了,在哪里加上disabled=false呢,授权窗口无非就同意和拒绝,在success同意和fail拒绝里加上disabled=false即可



二、原理
async 和 await 是 JavaScript 中用于处理异步操作的关键字,它们让代码更加简洁和易于理解,避免了传统的回调函数(callback)或 .then() 链式调用所带来的复杂性。async 和 await 是基于 JavaScript 的 Promise 的语法。
1. async 函数
async 关键字用来定义一个异步函数,表示该函数内部会有异步操作。异步函数总是返回一个 Promise,即使函数内部没有明确使用 return 返回一个 Promise,JavaScript 会自动把函数返回值包装在一个已解析的 Promise 中。
async function myFunction() {return 'Hello, world!';
}myFunction().then(result => {console.log(result);
});
2. await 表达式
await 关键字只能在 async 函数内部使用,它用于等待一个 Promise 解析(resolve)并返回解析后的结果。如果 await 后面的表达式不是一个 Promise,那么它会自动将其转换为一个已解析的 Promise。
async function fetchData() {let response = await fetch('https://api.example.com/data');let data = await response.json();return data;
}fetchData().then(data => {console.log(data); // 输出从 API 获取的 JSON 数据
});
3. async 和 await 的工作原理
- 当执行
await时,JavaScript 会暂停函数的执行,直到Promise解析(resolve)或者拒绝(reject)。 - 如果
Promise被成功解析,await会返回该值,函数会继续执行。 - 如果
Promise被拒绝,await会抛出一个错误(相当于抛出Promise.reject()的错误),你可以使用try...catch来捕获和处理这个错误。
4. 使用 try...catch 捕获错误
在处理异步操作时,我们通常会使用 try...catch 来捕获潜在的错误(例如网络请求失败等)。
示例
async function fetchData() {try {let response = await fetch('https://api.example.com/data');if (!response.ok) {throw new Error('Network response was not ok');}let data = await response.json();return data;} catch (error) {console.error('Fetch error:', error);}
}fetchData();
5. 组合多个异步操作
你可以在 async 函数中使用多个 await 来依次执行多个异步操作。需要注意的是,await 会按顺序依次等待每个 Promise 完成,这可能导致不必要的延迟。如果有多个独立的异步操作,可以考虑并行执行它们。
示例:依次执行多个异步操作
async function fetchData() {let userResponse = await fetch('https://api.example.com/user');let userData = await userResponse.json();let postsResponse = await fetch(`https://api.example.com/posts?userId=${userData.id}`);let postsData = await postsResponse.json();return { userData, postsData };
}fetchData().then(data => console.log(data));
示例:并行执行多个异步操作
javascript
async function fetchData() {let userPromise = fetch('https://api.example.com/user');let postsPromise = fetch('https://api.example.com/posts');let [userResponse, postsResponse] = await Promise.all([userPromise, postsPromise]);let userData = await userResponse.json();let postsData = await postsResponse.json();return { userData, postsData };
}fetchData().then(data => console.log(data));
在这个例子中,Promise.all() 会并行执行两个请求,只有在两个请求都完成后,才会继续进行数据解析。这样可以提高效率,避免等待一个请求完成后再去发送另一个请求。
总结
async:用来声明异步函数,返回一个 Promise。await:用来等待一个 Promise 被解析,通常与async配合使用。- 异常处理可以使用
try...catch捕获和处理。 - 可以使用
Promise.all()来并行执行多个异步操作,避免串行执行造成的性能瓶颈。
async/await 使得异步代码的书写更加简洁直观,避免了回调地狱和 .then() 链式调用的层层嵌套,提升了代码的可读性和维护性。
二、wx跳转
相关文章:
async 和 await的使用
一、需求 点击按钮处理重复提交,想要通过disabled的方式实现。 但是点击按钮调用的方法里有ajax、跳转、弹窗等一系列逻辑操作,需要等方法里流程都走完,再把disabled设为false,这样下次点击按钮时就可以继续走方法里的ajax等操作…...
Spring Cloud Vault快速入门Demo
1.什么是Spring Cloud Vault? Spring Cloud Vault 是 Spring Cloud 生态系统中的一个项目,旨在简化 Spring 应用程序与 HashiCorp Vault 的集成。它提供了一种方便的方式来管理和访问应用程序的敏感配置数据,如数据库凭证、API 密钥和其他机…...
道陟科技EMB产品开发进展与标准设计的建议|2024电动汽车智能底盘大会
11月12日,2024电动汽车智能底盘大会在重庆开幕。会议由中国汽车工程学会主办,电动汽车产业技术创新战略联盟、中国汽车工程学会智能底盘分会、智能绿色车辆与交通全国重点实验室承办。本届大会围绕电动汽车智能底盘相关技术发展与融合,满足高…...
GitHub Org
运营一个GitHub Org(组织)是一个复杂但充满价值的过程,它涉及多个方面,包括项目管理、团队协作、代码审查、文档维护、社区建设等。以下是一篇关于如何运营GitHub Org的详细指南,旨在帮助组织者更好地管理和维护其GitH…...
unity小:shaderGraph不规则涟漪、波纹效果
实现概述 在本项目中,我们通过结合 Sine、Polar Coordinates 和 Time 节点,实现了动态波纹效果。以下是实现细节: 核心实现 Sine 波形生成: 使用 Sine 节点生成基本的波形。该节点能够创建周期性变化,为波纹效果提供…...
【JavaScript】JavaScript开篇基础(6)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别
Spark RDD、DStream、DataFrame、DataSet 在窗口操作上的区别 1. Spark RDD 是否支持窗口操作: RDD 本身没有专门的窗口操作算子。原因: RDD 是一个弹性分布式数据集,设计为通用的、不可变的操作单元,主要用于批处理场景。窗口函…...
http自动发送请求工具(自动化测试http请求)
点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中,HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求,我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…...
网络IP地址会经常换吗?深入解析与实操指南
在互联网的生态系统中,IP地址(Internet Protocol Address)是每台连接设备的唯一标识符,它在网络通信中起着至关重要的作用。然而,不少用户观察到自己的IP地址有时会发生变化,这引发了诸多疑问。本文旨在详细…...
MapLocNet由粗到细的定位网络
论文链接 MapLocNet: Coarse-to-Fine Feature Registration for Visual Re-Localization in Navigation Mapshttps://arxiv.org/html/2407.08561v1 问题背景 当前自动驾驶的定位主要依赖于高精度的地图和GPS信号,但在城市环境中,GPS信号易受到多路径传…...
【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?
目录 一、背景描述 二、解决办法 三、清理效果 四、理论参考 解决方法 1. 清理未使用的 Docker 镜像、容器和卷 2. 查看 Docker 使用的磁盘空间 3. 调整 Docker 的存储位置 4. 增加磁盘空间 5. 调整 Docker Desktop 配置 6. 使用 Docker 清理工具(例如 D…...
构建客服知识库:企业效率提升的关键步骤
客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题,还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…...
java-Day06 内部类 Lambda表达式 API
内部类 内部类:就是在一个类中定义一个类 格式例: public class Outer { public class Inner { } } 内部类分类 1.成员内部类(了解) 创建成员内部类 外部类.内部类 对象名new外部类().new内部类() 2.静态内部类(了解) 3.局部内部类(了解) 4.匿名内部类…...
Springboot配置全局异常通用返回
Springboot配置全局异常通用返回 前言 前端对接了部分接口后,开始抱怨,“后端接口出参的格式总是千奇百怪,没有一个固定的格式,错误信息提示也不明朗,业务的状态码总是东一个西一个,前端这都不好做统一的…...
计算机视觉在自动驾驶汽车中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 计算机视觉在自动驾驶汽车中的应用 引言 计算机视觉在自动…...
wordpress functions文件的作用及详细说明
WordPress的functions.php文件是一个非常重要的主题文件,它允许开发者和用户向网站添加自定义代码片段,从而修改网站功能或添加新内容。以下是functions.php文件的主要作用和一些详细说明: 1. 自定义功能添加: functions.php文件…...
Cellebrite VS IOS18Rebooting
Cellebrite VS IOS18Rebooting我们想分享一些有关 iOS 18 重启“功能”的信息。在过去一周左右的时间里,人们对 iOS 18 中一项新的未记录功能产生了极大关注,该功能会导致设备在一段时间不活动后重新启动。 这意味着,如果设备在一定时间不活…...
[每日一氵] PySpark 的 log GC 部分是什么意思
2024-11-15T11:10:40.2920800: 2850.503: [GC (Allocation Failure) [PSYoungGen: 142705K->3472K(141312K)] 1403514K->1264289K(1543168K), 0.0170225 secs] [Times: user0.05 sys0.00, real0.01 secs] 这一行日志来自Java的垃圾收集器(Garbage Collector, …...
Transformer中的算子:其中Q,K,V就是算子
目录 Transformer中的算子 其中Q,K,V就是算子 一、数学中的算子 二、计算机科学中的算子 三、深度学习中的算子 四、称呼的由来 Transformer中的算子 其中Q,K,V就是算子 “算子”这一称呼源于其在数学、计算机科学以及深度学习等多个领域中的广泛应用和特定功能。以下是…...
JWTUtil工具类
写一个Jwt工具类 导入如下pom.xml依赖 <!--fastjson依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.33</version></dependency><!--jwt依赖--><dependenc…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
