当前位置: 首页 > news >正文

超详细 async和await 项目实战运用(附加文字解答+源码)

文章目录

  • 问题描述
  • async
    • 什么是 async
    • async 的作用
    • async 的应用场景
    • async 优点
  • await
    • 什么是 await
    • await 的作用
    • await 的应用场景
    • await 的优点
    • async和 await结合使用
  • 结束语

大家好!又到了愉快的周末假期,今天是2023年9月3日|农历七月十九,我最近还是比较忙的,但是觉得每一天过得也比较充实,无论在工作中遇到的技术难点,还是在生活中的点点滴滴。

本篇博文是我发布的第100篇文章,在上周收获了第一批粉丝(〃‘▽’〃),这次主要是来说一下在项目实战中如何处理异步之间的函数调用,下面以文字解答+源码的方式一一分享给大家。

问题描述

本次异步调用实现方式我是运用到了微信小程序中,我有两个函数,举例说一下:函数A和函数B,函数A去调用数据库返回id,然后函数B拿着这个id再次去查询数据,没使用异步之前我的做法是在onLoad或onShow中,先调用函数A,在调佣函数B,我发现了一个问题,函数A中id打印出来时null,而且是在调用完函数B之后才打印出来的,这明显不符合我的应用场景,我的应用场景是必须在调用函数B之前把id查询到,因为id是作为函数B查询数据库的查询条件,后来我采用asyncawait 进行解决的,具体解决思路如下:

async

先来简答了解一下async.

什么是 async

async是一个关键字,用于定义异步函数.

async 的作用

简化异步编程.

async 的应用场景

  1. 异步操作:当有需要处理异步操作的时候,如异步请求、文件读写等。
  2. 顺序控制:当需要按照一定的顺序执行多个异步操作时,可以使用await关键字确保异步操作的顺序性,避免回调地狱和复杂的Promise链式调用。
  3. 错误处理:async/await结合try/catch语句可以更方便地处理异步操作中的错误,使错误处理代码更加清晰和直观。

async 优点

  1. 简化了异步编程,并提供了更直观、更易于理解和编写的方式来处理异步操作。
  2. 适用于需要处理异步操作的场景,以及对代码的简洁性、可读性和可维护性有要求的场景下。

await

先来简答了解一下await .

什么是 await

await 是一个操作符,用于等待一个Promise对象的解决(resolved),并暂停当前异步函数的执行直到Promise对象被解决并返回解决值

await 的作用

使异步操作的代码看起来更像是同步的.

await 的应用场景

使用await时,它会暂停当前函数的执行,直到等待的Promise对象被解决。一旦Promise对象被解决,await表达式将返回Promise对象的解决值,并继续执行后面的代码

await 的优点

  1. 顺序控制:await关键字可以确保异步操作按照预期的顺序执行当一个异步操作需要依赖于另一个异步操作的结果时,可以用await等待前一个操作完成,然后进行后续操作。这样可以避免回调地狱和嵌套的.then()方法调用。
  2. 简化异步代码:await关键字使异步代码更易于理解和编写,尤其是在处理多个异步操作时。它可以使异步代码的结构更加线性,类似于同步代码,从而提高代码的可读性和可维护性。

async和 await结合使用

修改前
onShow():页面加载渲染时,调用此函数.

onShow() {this.loaddata();// 相当于我前面举例说明的函数Athis.getguardfamilyList();// 相当于我前面举例说明的函数B
}

loaddata() 函数,在调用getguardfamilyList()之前我输出来的this.modelvalue.idundefined,后端是有值的,调用完getguardfamilyList()之后才有值。

loaddata(){get('后端接口地址',{id:uni.getStorageSync('values').id}).then(res=>{this.modelvalue = res.resultconsole.log("this.modelvalue.id==============>",this.modelvalue.id)})
},

我在getguardfamilyList()中输出的modelvalue.idundefined.

getguardfamilyList() {let modelvalue=this.modelvalueconsole.log("modelvalue.id========>",modelvalue.id)get('后端接口地址',model).then((res) => {if (res.success) {this.shouhuquanjia = res.result}}})
},

修改后
在调用loaddata()的函数中添加async ,将onShow()定义为异步函数.

async onShow() {await this.loaddata();// 相当于我前面举例说明的函数Athis.getguardfamilyList();// 相当于我前面举例说明的函数B
}

在loaddata()函数前面加上async 关键字,定义为异步函数,并在get函数中添加await关键字,表示我在执行get查询数据库时,暂停其它函数执行,直到后端返回结果后,再接着往下执行,我原来的执行逻辑是在loaddata()去请求后端时,结果还没有返回,getguardfamilyList()就已经被执行了.

async loaddata(){await get('后端接口地址',{id:uni.getStorageSync('values').id}).then(res=>{this.modelvalue = res.resultconsole.log("this.modelvalue.id==============>",this.modelvalue.id)})
},

结束语

这就是我遇到的问题及解决方案,希望本篇博文可以解决你遇到的问题,如果有不明白的博主,或者你也遇到了类似的问题,私信我,我会一一为你进行解答,不收取任何费用,欢迎打扰哦~

相关文章:

超详细 async和await 项目实战运用(附加文字解答+源码)

文章目录 问题描述async什么是 asyncasync 的作用async 的应用场景async 优点 await什么是 awaitawait 的作用await 的应用场景await 的优点async和 await结合使用 结束语 大家好!又到了愉快的周末假期,今天是2023年9月3日|农历七月十九,我最…...

Maven入门教程(三):Maven语法

视频教程:Maven保姆级教程 Maven入门教程(一):安装Maven环境 Maven入门教程(二):idea/Eclipse使用Maven Maven入门教程(三):Maven语法 Maven入门教程(四):Nexus私服 Maven入门教程(五):自定义脚手架 6.Mav…...

C++技术点,故事解析

语言的魅力 从人类诞生开始 ,南方古猿到现代人类经历了非常多变化; 南方古猿到能人 有什么变化? 能人会使用工具,由于会使用工具 就可以获得肉类食物,当然只能吃一些动物腐肉 直到进化成直立人的晚期,在东…...

数据结构(Java实现)-字符串常量池与通配符

字符串常量池 在Java程序中,类似于:1, 2, 3,3.14,“hello”等字面类型的常量经常频繁使用,为了使程序的运行速度更快、更节省内存,Java为8种基本数据类型和String类都提供了常量池。…...

python强化学习--gym安装与使用

最近开始学习强化学习,第一步肯定是要学会安装和使用pym,原本以为很简单,事实上确实很简单,但是遇到一个小问题,就是安装gym之后,在应用的过程中,游戏界面没有显示出来,了解后才知道…...

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 思路:题目给出了先序遍历和中序遍历的结果,因为先序遍历遵循根–>左–>…...

(第六天)初识Spring框架-SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第六天)初识Spring框架 ​ 昨天我们已经把Mybatis框架的基本知识全部学完,内容有Mybatis是一个半自动化的持久层ORM框架,深入学习编写动态SQL&a…...

如何使用『Nginx』配置后端『HTTPS』协议访问

前言 本篇博客主要讲解如何使用 Nginx 部署后端应用接口 SSL 证书,从而实现 HTTPS 协议访问接口(本文使用公网 IP 部署,读者可以自行替换为域名) 申请证书 须知 请在您的云服务平台申请 SSL 证书,一般来说证书期限…...

Git仓库简介

1、工作区、暂存区、仓库 工作区:电脑里能看到的目录。 暂存区:工作区有一个隐藏目录.git,是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区&#xf…...

TensorRTC++ | INT8量化

Int8量化步骤 // 这是基本需要的组件 auto builder = make_nvshared(nvinfer1::createInferBuilder(logger)); auto config = make_nvshared(builder->createBuilderConfig())...

VS + qt环境使用QCustomPlot等三方库如何配置

文章目录 前言VS环境下引入第三方类库QCustomPlot方法一:解决办法: C中.dll与.lib文件的生成与使用1. 两种库:2.两种文件的区别 前言 Qt提供了显式和隐式导入第三方库方法,本文只介绍显示导入方法。 一般的第三方提供的库文件包…...

OS 段页结合的实际内存管理

虚拟内存承接段和页,从用户角度,虚拟内存提供段,从硬件角度,虚拟内存把段打散映射到页 先基于段的翻译,再基于页的翻译 p是pcb跟着进程换,64M一个段,set base就是建段表 因为每个进程虚拟地址…...

一种改进多旋翼无人机动态仿真的模块化仿真环境研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

02-请解释一下Java的内存模型和happens-before规则?【Java面试题总结】

请解释一下Java的内存模型和happens-before规则? 概念:Java内存模型,简称JMM,是一种定义了多线程程序中内存访问行为的规范。它定义了线程如何与主内存和工作内存进行交互,以及如何保证多线程程序的正确性和可见性。J…...

PVE 8 出现CPU 100% 冻结(卡死)

最近在研究PVE,然后下载官方最新版本系统8.x安装好后出现卡死问题,就连开个软件CPU也能飙到100%,开始我以为是硬件问题可能是资源不够,但是将系统切换回裸机(不用PVE启动)一点问题也没有,后来逐…...

【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《高效编程技巧》《C语言进阶》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言1.如何写出好的代码?1.2 如何分析一个函数写的怎么样 2. 代码板式的重要性2.1 代码…...

继承【C++】

文章目录 继承的概念继承的定义继承方式和访问限定符继承基类成员访问方式的变化 默认继承方式 基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元静态成员菱形继承及菱形虚拟继承继承的方式 菱形虚拟继承菱形虚拟继承原理 继承的概念 继承(inheritance)…...

ORB-SLAM3复现过程中遇到的问题及解决办法

在复现过程中遇到的问题的解决过程 1. 版本检查1.1 Opencv版本的检测1.2 Eigen版本的检测1.3 查看Python版本1.4 其他 2. 编译过程中遇到的问题及解决办法2.1 ./build.sh遇到的问题2.2 ./build_ros.sh遇到的问题 因为环境比较干净,所以遇到的问题相对少一些&#xf…...

vue开发桌面exe应用

vue开发桌面exe应用 Electron-vue 参考 Electron-vue搭建vue全家桶Element UI客户端(一) 如何使用Vue.js构建桌面应用程序...

C# 实现PictureBox从随机选择的文件夹内对图像进行随机播放

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...