Vue学习笔记(十二)

async与await

1. async

  1. async作为一个关键字放到声明函数前面,表示该函数为一个异步任务,不会阻塞后面函数的执行
  2. async函数里如果有异步过程会等待,但async函数本身会马上返回,不会阻塞当前线程。可以简单认为async函数工作在主线程,同步执行,不会阻塞界面渲染;async函数内部由await修饰的异步过程,工作在相应的协程上,会阻塞等待异步任务的完成再返回
  3. async函数返回类型为Promise对象
    async函数会返回一个promise,并且Promise对象的状态值是resolved(成功的)
    如果没有在async函数中写return,那么Promise对象resolve的值就是是undefined
    如果写了return,那么return的值就会作为成功的时候传入的值

这是和普通函数本质上不同的地方,也是使用时重点注意的地方:
1. return new Promise(),这个符合async函数本意
2. return data 这是同步函数的写法,特别注意这其实就相当于Promise.resolve(data);还是一个Promise对象,但在调用async函数的地方通过简单的等号操作(=)是拿不到这个data的,因为返回值是一个Promise对象,所以需要用then(data => { })才可以拿到data
3. 如果没有返回值,相当于返回了Promise.resolve(undefined);

        <script>const aa = async () => {return 1//return Promise.resolve(1)// return new Promise((resolve, reject) => {// resolve(1)// })}const bb = async () => {return Promise.resolve(1)// return new Promise((resolve, reject) => {// resolve(1)// })}//aa() 返回结果是 Promise对象console.log(`output->aa()`,aa())//获取异步函数的返回值aa().then(res => {console.log(`output->res`,res)})</script>
  1. 无等待
    在没有await的情况下执行async函数,它会立即执行,返回一个Promise对象,并且不会阻塞后面的语句,这和普通返回Promise对象的函数并无二致

2. await

  1. await只能在async函数内部使用:不能放在普通函数里面,否则会报错
  2. await关键字后面跟Promise对象:在Pending状态时,相应的协程会交出控制权,进入等待状态,这是协程的本质
  3. await是async wait的意思: wait的是resolve(data)的消息,并把数据data返回,比如下面代码中,当Promise对象由Pending变为Resolved的时候,变量a就等于data,然后再顺序执行下面的语句console.log(a),这真的是等待,真的是顺序执行,表现和同步代码几乎一模一样
const a = await new Promise((resolve, reject) => {
// async process ...
return resolve(data);
});
console.log(a);
  1. await后面也可以跟同步代码: 不过系统会自动将其转化成一个Promsie对象
const a = await 'hello world'
// 相当于
const a = await Promise.resolve('hello world');
// 跟同步代码是一样的,还不如省事点,直接去掉await关键字
const a = 'hello world';
  1. await对于失败消息的处理: await只关心异步过程成功的消息resolve(data),拿到相应的数据data,至于失败消息reject(error),不关心不处理;对于错误的处理有以下几种方法供选择:
    1. 让await后面的Promise对象自己catch
    2. 也可以让外面的async函数返回的Promise对象统一catch
    3. 像同步代码一样,放在一个try…catch结构中
async function fetchData() {// 将异步和同步的代码放在一个try..catch中,异常都能抓到try {const array = null;let data = await asyncFn(); // 这里用await关键字,就能拿到结果值;否则,没有await的话,只能拿到Promise对象if (array.length > 0) { // 这里会抛出异常,下面的catch也能抓到array.push(data);}} catch (error) {console.log(error);}}document.addEventListener('DOMContentLoaded', fetchData);
  1. await对于结果的处理: await是个运算符,用于组成表达式,await表达式的运算结果取决于它等的东西,如果它等到的不是一个Promise对象,那么await表达式的运算结果就是它等到的东西;如果它等到的是一个Promise对象,await就忙起来了,它会阻塞其后面的代码,等着Promise对象resolve,然后得到resolve的值,作为await表达式的运算结果;虽然是阻塞,但async函数调用并不会造成阻塞,它内部所有的阻塞都被封装在一个Promise对象中异步执行,这也正是await必须用在async函数中的原因

3. 综合案例

<script>// 模拟一个异步操作函数const myPromise1 = () => {return new Promise((resolve, reject) => {console.log(`output->创建myPromise1`)// 模拟一个异步操作,2秒钟后将结果返回setTimeout(() => {const random = Math.random()if (random > 0.5) {resolve(`myPromise1成功`);} else {reject(`myPromise1失败`)}}, 2000)})}// 模拟一个异步操作函数const myPromise2 = () => {return new Promise((resolve, reject) => {console.log(`output->创建myPromise2`)// 模拟一个异步操作,2秒钟后将结果返回setTimeout(() => {const random = Math.random()if (random > 0.5) {resolve(`myPromise2成功`);} else {reject(`myPromise2失败`)}}, 2000)})}// 模拟一个异步操作函数const myPromise3 = () => {return new Promise((resolve, reject) => {console.log(`output->创建myPromise3`)// 模拟一个异步操作,2秒钟后将结果返回setTimeout(() => {const random = Math.random()if (random > 0.5) {resolve(`myPromise3成功`);} else {reject(`myPromise3失败`)}}, 2000)})}const myAsync = async () => {try {console.log(`myAsync开始执行`)//await 同步执行代码获取Promise的resolve结果const data1 = await myPromise1()const data2 = await myPromise2()const data3 = await myPromise3()return `myAsync执行成功`} catch (error) {//await 执行出现错误处理(包括Promise的reject结果)console.log(`myAsync执行出错:`, error)}}//myAsync函数是async异步的 返回结果是Promise对象myAsync().then((res) => {console.log(`output->res`, res)}).catch((error) => {console.log(`output->error`, error)})
</script>

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

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

相关文章

【实战篇】requests库 - 有道云翻译爬虫 【附:代理IP的使用】

目录 〇、引言一、目标二、请求参数分析三、响应分析四、编写爬虫脚本【隧道代理的使用】 〇、引言 无论是学习工作、旅游出行、跨境电商、日常交流以及一些专业领域都离不开翻译工具的支持。本文就带大家通过爬虫的方式开发一款属于自己的翻译工具~ 一、目标 如下的翻译接口…

MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler

MyBatis的SQL执行过程 在前面一系列的文档中&#xff0c;我已经分析了 MyBatis 的基础支持层以及整个的初始化过程&#xff0c;此时 MyBatis 已经处于就绪状态了&#xff0c;等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程&#xff0c;该过程比较复杂&#xff…

达梦数据迁移工具DTS使用实践

1、环境描述 2、DTS概述 1.支持视图、存储过程/函数、包、类、同义词、触发器等对象迁移&#xff1b; 2.支持数据类型的自动映射&#xff0c;编码转换&#xff1b; 3.支持根据条件自定义迁移部分数据&#xff1b; 4.向导式迁移步骤&#xff0c;上手简单&#xff1b; 5.支持 we…

【Web.路由】——路由约束

我们需要明确的一点就是&#xff0c;一个URL地址就是一个路由值。 而路由约束&#xff0c;就是制定出的一套规则&#xff0c;只有路由值与路由约束中的规则匹配&#xff0c;才可以进行下一步操作。 路由约束不仅可用于路由请求&#xff0c;还可以用于链接的生成。 参数值约束 …

医药公司常用的九大翻译场景

医药公司的翻译工作通常涉及多个专业领域&#xff0c;以下是一些常见的翻译场景&#xff1a; 1、药品说明书翻译&#xff1a;包括药物的成分、副作用、使用方法、储存条件等内容的翻译&#xff0c;必须准确无误&#xff0c;以确保患者和医务人员能够正确使用药物。 2、临床研…

VB中的安全性考虑,如防止SQL注入、XSS攻击等

在Visual Basic (VB) 开发中&#xff0c;安全性是一个至关重要的考虑因素。为了防止SQL注入、跨站脚本&#xff08;XSS&#xff09;攻击等常见安全威胁&#xff0c;开发人员需要采取一系列措施来确保应用程序的安全性。以下是对VB中安全性考虑的详细描述&#xff1a; 防止SQL注…

c++编解码封装

多态版编解码 对服务器和客户端的结构体进行序列化然后对数据进行反序列化 案例分析 代码demo Codec.h #pragma once #include <iostream>class Codec { public:Codec();virtual std::string encodeMsg();//string是标准库的string类virtual void* decodeMsg();virtu…

Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条&#xff0c;可设置背景色、进度条颜色&#xff08;渐变色&#xff09;下载进度控制&#xff1b;可二次定制度高&#xff1b; 核心代码&#xff1a; Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…

防抖与节流 - 2024最新版前端秋招面试短期突击面试题【100道】

防抖与节流 - 2024最新版前端秋招面试短期突击面试题【100道】 ⏲️ 在JavaScript中&#xff0c;防抖&#xff08;Debouncing&#xff09;与节流&#xff08;Throttling&#xff09;是两种常用的性能优化技术&#xff0c;尤其在处理频繁触发的事件时&#xff0c;如滚动、窗口调…

SSH登录介绍

说明&#xff1a;一般登录服务器&#xff0c;我们可以用远程连接工具&#xff0c;如XShell、Windterm等&#xff0c;或者通过公司搭建的JumpServer&#xff08;跳板机、堡垒机&#xff09;来连接。前者是点对点登录&#xff0c;输入主机、端口&#xff0c;通过SSH协议登录&…

中信银行西安分行完成首笔上市公司股票回购增持专项贷款审批

10月18日上午&#xff0c;中国人民银行联合国家金融监管总局、中国证监会发布《关于设立股票回购增持再贷款有关事宜的通知》&#xff0c;创新推出股票回购增持专项再贷款货币政策工具&#xff0c;旨在鼓励金融机构支持上市公司回购和股票增持&#xff0c;进一步提振市场信心&a…

ValueError: Object arrays cannot be loaded when allow_pickle=False

文章目录 问题解决方法1&#xff1a;allow_pickleTrue解决方法2&#xff1a;降低numpy版本错误原因&#xff1a;python和numpy版本不兼容 问题 Traceback (most recent call last): File “D:\project\test_st\retrieval\read_npy.py”, line 4, in data np.load(‘mosi0__le…

如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8

如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8 在日常开发中&#xff0c;我们经常会遇到不同编码格式的文件&#xff0c;比如 UTF-8、ASCII、Windows-1252、ISO-8859-1 等。文件编码不一致可能导致读取或处理文件时出现乱码&#xff0c;特别是在批量处理数据文件时。…

【三十八】【QT开发应用】vlcplayer视频播放器(一)实现视频播放,视频暂停,视频停止,进度条调节,音量调节,时长显示功能

效果展示 vlcplayer_test视频播放器 MainWidget.ui 注意控件的布局和命名&#xff0c;控件的命名和信号与槽函数的绑定有关&#xff0c;所以这点很重要。 下载VLC组件和环境配置 videolan下载地址我下载的是vlc-3.0.8-win64版本. 将下载的文件复制粘贴到项目文件中. 复制粘…

PostgreSQL中查询每个账号的最新和最新前的数据

问题背景 有时候我们需要PostgreSQL中查询每个账号的最新和最新前的数据&#xff0c;也就是Rank12的数据供使用。 解决方案 如果PostgreSQL中查询每个账号的最新和最新前的数据&#xff0c;我们可以使用窗口函数来实现。窗口函数允许我们对数据进行分区&#xff0c;然后在每个…

linux上trace code的几种方法

我们在看代码时&#xff0c;总是会遇到下面问题&#xff1a; 1.查看某个场景下的代码执行流 2.查看某个函数被执行时的routine 但是&#xff0c;如果直接查看源码&#xff0c;源码可能代码量大&#xff0c;且分支多&#xff0c;不容易理清。就需要让相关程序运行起来查看。 …

《论文写作》课程心得

《论文写作》课程心得 在学习闵帆老师的《论文写作》课程后&#xff0c;结合平时观察同门的论文评改过程&#xff0c;我对论文写作有了新的体会。因此&#xff0c;我写下这篇博客&#xff0c;作为我对论文写作的总结。在我看来&#xff0c;论文写作这门课虽然主要讲的是如何写…

【LeetCode每日一题】——1791.找出星型图的中心节点

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 图 二【题目难度】 简单 三【题目编号】 1791.找出星型图的中心节点 四【题目描述】 有一个…

深入了解 美国高防 CN2 :如何提升全球化业务的网络安全与性能

美国高防 CN2 的重要性 在跨国企业和全球化业务的不断扩展下&#xff0c;对高性能和安全的网络连接需求不断增加。美国高防 CN2&#xff08;Global Internet Access&#xff09;以其卓越的跨境传输效率和强大的防护能力&#xff0c;成为许多企业关注的焦点。尤其是对电商、游戏…

Endnote如何关联Word,在Word上通过Endnote插入文献

1、Word版本已被激活 首先检查Word版本是否已经被激活&#xff0c;不管是正版还是破解版&#xff0c;未激活状态&#xff08;试用&#xff09;可能会导致关联不成功。如下图所示为已激活版本&#xff0c;在“文件”—“账户”可看。 2、勾选开发工具 其次&#xff0c;打开Wor…