ES8 学习 -- async 和 await / 对象方法扩展 / 字符串填充

文章目录

  • 1. async 和 await
    • 1.1 基本语法
    • 1.2 使用示例
    • 1.3 案例练习
  • 2. 对象方法扩展
    • 2.1 Object.values(obj)
    • 2.2 Object.entries(obj)
    • 2.3 Object.getOwnPropertyDescriptors(obj)
      • 使用示例
  • 3. 字符串填充
  • 4. 函数参数的末尾加逗号

1. async 和 await

async 函数,使得异步操作变得更加方便。

  • 更好的语义。
  • 返回值是Promise。

1.1 基本语法

async function test(){
let res = awiat … // 对象
})
}

async function test(){
console.log("test")
// return "sucess-11111111"
return new Promise((resolve,reject)=>{
// resolve("data-11111")
reject ("err-22222")
})
}
let res = test()
// console.log(res)
res.then(res=>{
console.log("success",res)
})catch(err=>{
console.log("err",err)
)

// test
// err err-22222

根据以上代码我们可以得出:

  1. async返回值是非promise对象时,返回值一定是fulfiled状态,指定执行then();
  2. async返回的是promsie对象时,我们要个人句返回的promsie对象判断fulfilled 和 rejected两种状态,接着再进行判断执行then() 还是catch()。

async 和 await只能搭配着成对出现!

1.2 使用示例

function ajax(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log("ajax-成功")
resolve("data-11111")
},1000)
})
}
async function test(){
// await后面可以接非promise对象,或者promise对象
// let res = await {name:"kerwin"}  //{name:kerwin}
// let res = ajax()
let res = await ajax()
console.log(res)
test()

没有使用await 时:
// Promise{}
// ajax-成功

使用await 时:
// ajax-成功
// data-11111
// 这段代码是在 1s 之后才出现的!

为什么代码在 1s 之后才出现呢?这是因为使用await 时,如果异步结果不传给res ,那么程序就会在此等着,不去执行下面的程序。

如果某块代码出现错误时,代码就会直接跳到catch() 处,而不会继续执行下面的代码。

一般情况下我们的代码执行顺序就入下面所示,在then() 中渲染页面,在catch() 中处理错误:

async function test(){
... // 与上边代码一样
}
test().then(res=>{
console.log(res)
// 渲染页面
}).catch(err=>{
console.log("err",err)
// 处理错误
})

但是我们也有另一种写法:
我们可以直接在方法中渲染页面,同时写try…catch… 用来处理错误。

async function test()
// await后面可以接非promise对象,或者promie对象
// let res = await {"name":"Kerwin"}
try {
let res1 = await ajax1()
console.log(res1)
let res2 = await ajax2(res1)
console.log(res2)
// 渲染页面
console.log("渲染页面")
catch (error){
console.log("err",error)
}
}

1.3 案例练习

function ajax(url){
return new Promise((resolve,reject)=>{
let xhr = new XMLHttpRequest()
xhr.open("get",url,true)
xhr.send()
xhr.onreadystatechange = function(){
if(xhr.readystate === 4){
if(xhr.status >= 200 && xhr.status < 300){
resoLve(JSON.parse(xhr.responseText))
}else{
reject(xhr.responseText)
}
}
}
})
async function test(){
// let res = await ajax("1.json")
// console.log(res)
// let res2 = await ajax("2.json")
// console.log(res2)//promise.all
let res = await Promise.all([ajax("1.json"),ajax("2.json")])
}
test()

2. 对象方法扩展

2.1 Object.values(obj)

let obj = {
name:"kerwin",
age:100
}
console.log(object.values(obj))

// (2) [‘kerwin’,100]

2.2 Object.entries(obj)

let obj = {
name:"kerwin",
age:100
}
console.log(object.entries(obj))

// (2) [‘kerwin’,100]

let obj = {
name:"kerwin",
age:100
}
let m = new Map(object.entries(obj))
console.log(m)

在这里插入图片描述

2.3 Object.getOwnPropertyDescriptors(obj)

该方法可以用来复制对象,当对象中存在拦截属性的方法时,我们使用object.assign() 就不灵了(object.assign() 只能复制属性和简单方法,具有拦截属性的方法就不能被复制)。所以此时我们选择使用Object.getOwnPropertyDescriptors(obj)。

拦截属性函数中我们一般不会去拦截对象的现有属性,比如说下面的代码中我们使用get() 获取this.name ,当程序运行时会不断调用get() ,程序一直在循环进行,但是得不到结果;
我们一般会转换方式的到对象的现有属性,这样可以解决对现有属性依赖问题。

let obj = {
name:"kerwin",
age:100,
// get name() {
// console.log("get")
// return this.name
// }
get uppername(){
console.log("get")
return this.name.substring(0,1).toUppercase()+this.name.substring(1)
}
set uppername(value){
console.log("set",value)
this.name = value
}
}

使用示例

使用Object.assign( ) :

let obj1 ={ }
Object.assign(obj1,obj)

在这里插入图片描述

let obj1 ={ }
Object.defineProperties(obj1,object.getownPropertyDescriptors(obj))

在这里插入图片描述

3. 字符串填充

let str = "kerwin"
console.log(str.padstart(10,'x'))
console.log(str.padEn(10,'x'))
console.log(str.padstart(5,'x'))
console.log(str.padEnd(5,'x'))

// xxxxkerwin
// kerwinxxxx
// kerwin
// kerwin

一般用于设置时间格式

let list = [
for(let i = 1;i < 13 ;i++)
// list.push(String(i).padstart(2,"0"))
list.push((i+"").padstart(2,"0"))

4. 函数参数的末尾加逗号

function test(
a,
b,
C,
){
console.log(a,b)
}
test(
1,
2,
3,
)

一般是让gate 中修改完代码后想看看修改完和修改前的区别。(了解一下就行)

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

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

相关文章

速盾:cdn节点速度慢会影响访问吗

CDN&#xff08;内容分发网络&#xff09;是一种通过在全球分布式节点上存储内容的网络架构&#xff0c;旨在提供更快、更可靠的访问体验。然而&#xff0c;如果CDN节点的速度慢&#xff0c;确实会影响用户的访问体验。 CDN节点的速度慢可能由多种因素引起&#xff0c;比如节点…

基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“汽车销售分析与管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 销售经理系统首页图 客户管理图 车辆…

c++的学习之路:8、内存管理与模板

一、 C/C内存分布 首先在c语言的动态内存管理中我知道了代码是如何存储数据的&#xff0c;然后c是根据c语言底层变化来的&#xff0c;那么c语言的内存管理就是适用c的内存管理&#xff0c;在c语言中程序是分为几个部分存储&#xff0c;例如在栈堆等等&#xff0c;他们的分布如…

Golang并发模型-Pipeline模型、Fan-in Fan-out模型

这段时间由于项目的需要&#xff0c;本人正在研究关于如何优雅的进行go的并发&#xff0c;以下是结合资料和视频的结果&#xff0c;文末会给出参考资料 Go语言的并发模型主要通过goroutine和channel实现&#xff0c;通过这个我们可以更有效地使用IO和CPU 这里我们围绕生成一个…

【随笔】Git 基础篇 -- 分支与合并(九)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

mysql 基本查询

学习了mysql函数&#xff0c;接下来学习mysql基本查询。 1&#xff0c;基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT 语句。SELECT语句的基本格式是&#xff1a; SELECT (*I <字段列表>} FROM <表1>,<表2>..[WHERE<表达式> [GROUP BY <…

手写简易操作系统(二十一)--硬盘驱动

前情提要 上面一节我们实现了 malloc 和 free 的系统调用&#xff0c;这一节我们来实现硬盘驱动。 一、硬盘分区 我们的文件系统安装在一块全新的硬盘中&#xff0c;我们先创建它&#xff0c;然后在给他分区。 1.1、创建硬盘 首先是创建&#xff0c;这个之前我们已经干过一…

Linux网络编程一(协议、TCP协议、UDP、socket编程、TCP服务器端及客户端)

文章目录 协议1、分层模型结构2、网络应用程序设计模式3、ARP协议4、IP协议5、UDP协议6、TCP协议 Socket编程1、网络套接字(socket)2、网络字节序3、IP地址转换4、一系列函数5、TCP通信流程分析 第二次更新&#xff0c;自己再重新梳理一遍… 协议 协议&#xff1a;指一组规则&…

python内置函数 Z

python内置函数 Z Python 解释器内置了很多函数和类型&#xff0c;任何时候都能使用。 Z 名称描述zip返回元组的迭代器。 zip(*iterables, strictFalse) 在多个迭代器上并行迭代&#xff0c;从每个迭代器返回一个数据项组成元组。 示例: >>> for item in zip([…

LlamaIndex——RAG概述

文章目录 一、使用LLM1. 模型2. 词嵌入3. Prompt 二、加载1. 加载2. 转换&#xff08;1&#xff09;高级API&#xff08;2&#xff09;低级API 三、索引/EmbeddingTop K Retrieval 四、存储五、查询六、评估1. 生成结果质量评估2. 检索结果评估 RAG&#xff08;检索增强生成&am…

前端开发语言有哪些

前端开发语言有哪些 在数字时代&#xff0c;前端开发已经成为软件开发领域的一个重要分支。前端开发主要关注的是用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;而实现这些的关键在于选择适合的前端开发语言。本文将详细介绍前端开发中…

Kafka架构概述

Kafka的体系结构 Kafka是由Apache软件基金会管理的一个开源的分布式数据流处理平台。Kafka具有支持消息的发布/订阅模式、高吞吐量与低延迟、持久化、支持水平扩展、高可用性等特点。可以将Kafka应用于大数据实时处理、高性能数据管道、流分析、数据集成和关键任务应用等场景。…

IMBoy缓存系统深度解析:为何选择depcache而非ETS或Redis

在IMBoy即时通讯平台的开发过程中&#xff0c;我们面临了选择最佳缓存系统的关键技术决策。经过细致的考量&#xff0c;我们选择了depcache作为IMBoy的核心缓存机制。本文将阐述IMBoy缓存系统的选型理由&#xff0c;并对比分析depcache与纯ETS方案及Redis方案的不同优势。 1. …

windows C++ 进程遍历、线程遍历模板。后附模板代码

目录 一、进程遍历 1. 使用CreateToolhelp32Snapshot函数创建系统快照 2.Process32FirstW 3. Process32NextW 4. PROCESSENTRY32W 5. OpenProcess hProcess 1. 查询信息 2. 修改进程状态 3. 访问进程虚拟内存 4. 处理和线程 二、线程遍历 1. 创建系统快照 2. …

20240402—Qt如何通过动态属性设置按钮样式?

前言 正文 1、点击UI文件 2、选择Bool型或是QString 3、设置后这里出现动态属性 4、这qss文件中绑定该动态属性 QPushButton[PopBlueBtn"PopBlueBtn"]{background-color:#1050B7;color:#FFFFFF;font-size:20px;font-family:Source Han Sans CN;//思源黑体 CNbor…

【JavaEE初阶系列】——一万字带你了解 JUC常见类 以及 线程安全集合类(哈希表)

目录 &#x1f6a9;JUC(java.util.concurrent) 的常见类 &#x1f388;Callable 接口 &#x1f308;理解 Callable(相关面试题) &#x1f308;理解 FutureTask &#x1f4dd;线程创建方式 &#x1f388; ReentrantLock可重入锁 &#x1f308;ReentrantLock 优势&#x…

Codeforces Round 798 (Div. 2) (C 树形dp D 曼哈顿距离转换 E 位运算构造)

C&#xff1a;dp以f[i]为根的时候能获得多少个节点&#xff0c;那么dp就是全部儿子里面找一个切掉&#xff0c;其他就是 f[v]的总和了 #include<bits/stdc.h> using namespace std; const int N 1e610,M2*N,mod1e97; #define int long long typedef long long LL; typ…

4.2日java总结,以及窗口的创建

今日份学习——字符串的进阶 1.StringBulider StringBulider是一个java里的关键字&#xff0c;可以看做一个容器&#xff0c;但是其是一个可以改变的容器&#xff0c;对其有四种操作可以进行&#xff0c;分别是添加元素&#xff08;append&#xff09;&#xff0c;反转元素&a…

谷粒商城实战(009 缓存-分布式锁)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第158p-第p165的内容 分布式锁 原理和使用 使用下shell对产生的命令进行发送 查看 -> 撰写 -> 撰写栏 idea 选中的代码提取成方法 加锁…

【教学类-09-07】20240401细线迷宫图02+箭头图片(A4横版一页-2份竖版)

作品展示 作品展示 word模板 重点说明 代码展示 批量制作细线条的迷宫图(A4横板一面2张竖版)箭头图片 作者&#xff1a; 1、落难Coder https://blog.csdn.net/u014297502/article/details/124839912 2、AI对话大师 3、阿夏 作者&#xff1a;2024年4月3日 numint(input(几人&…